JDBC - 用于只读操作的setAutoCommit

dcp*_*dcp 7 java connection jdbc

假设我有一个创建数据库连接的常用方法:

Connection getConnection() throws SQLException {
    Connection con = ... // create the connection
    con.setAutoCommit(false);
    return con;
}
Run Code Online (Sandbox Code Playgroud)

我把这个setAutoCommit(false)调用放在这里,这样这个方法的调用者就不必担心设置它了.但是,如果调用者执行的操作只是读取数据,这是不好的做法吗?有没有额外的开销?

我个人认为最好将逻辑集中在一个地方,这样调用者就不必设置自动提交,这样可以避免代码冗余.我只是想确保它不会给只读操作带来任何不必要的开销.

Bal*_*usC 5

Autocommit对SELECT查询没有任何价值.但是,关闭自动提交确实是一种更常见的做法.通常,您希望在事务中触发查询.默认情况下,大多数连接池也将其关闭.但是,我建议将它作为连接管理器的配置设置和/或使用布尔参数重载方法,这样你至少可以对它进行任何控制.


Pas*_*ent 5

我在这里调用setAutoCommit(false)调用,以便此方法的调用者不必担心设置它.

这是很好的IMO,我个人认为永远不应该在应用程序中启用自动提交模式.所以我的建议是关闭自动提交.

但是,如果调用者执行的操作只是读取数据,这是不好的做法吗?有没有额外的开销?

从严格的性能角度来看,它为每个具有开销的SQL语句开始和结束数据库事务,并可能降低应用程序的性能.

顺便说一句,SELECT语句受setAutoCommit(boolean)javadoc的影响:

将此连接的自动提交模式设置为给定状态.如果连接处于自动提交模式,则其所有SQL语句将作为单个事务执行并提交.否则,其SQL语句将分组为通过调用方法提交或方法回滚来终止的事务.默认情况下,新连接处于自动提交模式.

语句完成时发生提交.语句完成的时间取决于SQL语句的类型:

  • 对于DML语句,例如Insert,Update或Delete,以及DDL语句,语句在完成执行后立即完成.
  • 对于Select语句,关闭关联结果集时语句完成.
  • 对于CallableStatement对象或返回多个结果的语句,当关闭所有关联的结果集并且已检索到所有更新计数和输出参数时,语句将完成.