首页 > 解决方案 > 禁用 auto_commit 时查询后的操作

问题描述

在某些情况下,我们应该setAutoCommit(false)在查询之前,请参阅此处https://jdbc.postgresql.org/documentation/head/query.html#query-with-cursor以及执行查询后 PostgreSQL JDBC 驱动程序何时获取行?.

但是这些主题都没有提到查询后如何做,何时ResultSet关闭Statement但未关闭Connection(可能被ConnectionPoolor回收DataSource)。

我有这些选择:

哪一个是最佳实践?

标签: postgresqljdbcdatabase-connectiondatabase-cursorautocommit

解决方案


甚至查询也在事务中执行。如果您启动了一个事务(在执行查询时隐式发生),那么您也应该结束它。通常,如果连接池表现良好,什么也不做会在连接返回池时导致回滚。但是,最好不要依赖这种隐式行为,因为并非所有连接池或驱动程序都会遵守它。例如,Oracle JDBC 驱动程序将在连接关闭时提交(或者至少,它在过去这样做过,我不确定它是否仍然如此),并且它可能不是您的程序的正确行为。明确调用commit()rollback()将清楚地记录程序的边界和期望。

尽管提交或回滚仅执行查询(因此未修改数据库)的事务将具有相同的最终结果,但我建议使用commit()而不是rollback(),以清楚地表明结果是成功的。对于某些数据库,提交可能比回滚更便宜(反之亦然),但如果结果相同,此类系统通常具有将提交转换为回滚的启发式方法(反之亦然,无论“更便宜”)。

完成后,您通常不需要切换自动提交模式。一个表现良好的连接池应该为您做到这一点(尽管不是所有的都这样做,或者有时您需要显式配置它)。仔细检查连接池的行为和选项以确保。

如果您想自己继续使用连接(而不返回池),则切换回自动提交模式就足够了:setAutoCommit(true)使用活动事务调用将自动提交该事务。


推荐阅读