禁用 auto_commit 后查询后的操作

What to do after a query when auto_commit is disabled

在某些情况下,我们应该setAutoCommit(false)在查询之前,请参阅此处https://jdbc.postgresql.org/documentation/head/query.html#query-with-cursor and When does the PostgreSQL JDBC driver fetch rows after executing a query?

但是none这些题目提到查询后,当ResultSetStatement关闭但Connection不关闭时怎么办(可能被[=回收15=] 或 DataSource).

我有这些选择:

哪个是最佳做法?

这取决于你之后想做什么。如果你想return在操作后自动提交模式:

conn.setAutoCommit(true);

这将自动提交打开的事务。

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

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

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

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