在某些情况下,我们应在查询之前setAutoCommit(false)
,请在此处查看https://jdbc.postgresql.org/documentation/head/query.html#query-with-cursor和When does the PostgreSQL JDBC driver fetch rows after executing a query?。
但这些主题均未提及在ResultSet
和Statement
关闭但Connection
未关闭时的查询后如何处理(可由ConnectionPool
或{{ 1}})。
我有以下选择:
DataSource
用于下一个查询)autoCommit = false
哪种方法最好?
答案 0 :(得分:1)
即使查询在事务中执行。如果启动了事务(在执行查询时隐式发生),则还应该结束它。通常,如果行为良好(使用行为良好的连接池),则将连接返回到池时会导致回滚。但是,最好不要依赖这种隐式行为,因为并非所有连接池或驱动程序都将遵守该隐式行为。例如,Oracle JDBC驱动程序将在连接关闭时提交(或者至少是在过去这样做的,我不确定它是否仍然这样做),并且它可能不是您程序的正确行为。明确调用commit()
或rollback()
将清楚记录程序的边界和期望。
尽管提交或回滚仅执行查询(因此未修改数据库)的事务将具有相同的最终结果,但我还是建议使用commit()
而不是rollback()
清楚表明结果是成功的。对于某些数据库,提交可能比回滚便宜(反之亦然),但是这种系统通常具有启发式功能,如果结果相同,则该启发式会将提交转换为回滚(反之亦然,更便宜)。 >
完成后,通常不需要切换自动提交模式。行为良好的连接池应该为您做到这一点(尽管并非全部都可以,或者有时您需要显式配置此功能)。仔细检查连接池的行为和选项,以确保确定。
如果您想自己继续使用连接(不返回池),那么切换回自动提交模式就足够了:在活动事务中调用setAutoCommit(true)
将自动提交该事务。
答案 1 :(得分:0)
这取决于您以后要做什么。如果要在操作后返回自动提交模式:
conn.setAutoCommit(true);
这将自动提交未结交易。