oracle.jdbc.autoCommitSpecCompliant VS setAutoCommit(false)
Posted
技术标签:
【中文标题】oracle.jdbc.autoCommitSpecCompliant VS setAutoCommit(false)【英文标题】: 【发布时间】:2021-11-22 01:16:34 【问题描述】:我们有使用普通 JDBC 连接 Oracle 数据库的旧应用程序。 最近,该数据库已升级到 Oracle 19c。
为此,我们现在使用以下依赖项。
<dependency>
<groupId>com.oracle.ojdbc</groupId>
<artifactId>ojdbc8</artifactId>
<version>19.3.0.0</version>
</dependency>
升级后,应用程序开始报错,原因很明显,比如在 Callable 之前 Result 没有关闭,在 rollback() 期间等。
我发现以下两种可行的方法。
System.setProperty ("oracle.jdbc.autoCommitSpecCompliant", "false");
或
connection.setAutoCommit(false);
我想知道以上两种解决方案有什么区别,哪一种更好。
参考链接-https://docs.oracle.com/en/database/oracle/oracle-database/21/jajdb/oracle/jdbc/OracleConnection.html#CONNECTION_PROPERTY_AUTO_COMMIT_SPEC_COMPLIANT
【问题讨论】:
我不是这方面的专家,但通过阅读提供的链接,我想说你应该使用setAutoCommit(false)
,因为“鼓励用户修改他们的应用程序以支持规范而不是使用这个旗帜。” - 据我了解,如果您将标志设置为 false,如果您在使用自动提交等的连接上调用 rollback()
,驱动程序将不会引发异常,我怀疑这就是您想要的(即驱动程序是对潜在的错误保持沉默)。
如果您使用setAutoCommit(false)
,您还必须更改您的应用程序以在适当的情况下显式调用commit()
或rollback()
。这两个选项并不等效,但我个人会修改我的应用程序,使其适用于 JDBC 指定的行为。
【参考方案1】:
从您链接到的documentation,更改oracle.jdbc.autoCommitSpecCompliant
:
更改驱动程序的自动提交行为。默认情况下,驱动程序符合 JDBC 规范。用户可以选择通过更改此标志的值来更改行为。
而connection.setAutoCommit(false);
:
将此连接的自动提交模式设置为给定状态。
后面的这个调用只会改变一个连接的自动提交状态,不会改变任何其他连接的自动提交状态;前者更改了所有未来连接的默认自动提交行为。
哪个更好。
两者都没有,它们有不同的用例,您应该使用最适合您的用例的。
如果您有多个连接都不需要将自动提交作为默认行为,那么您可以在驱动程序上设置该值。 (如果您有混合自动提交状态的连接,请不要这样做,特别是如果某些应用程序在自动提交为 true 时依赖默认状态。)
如果您想单独处理连接,请设置每个连接的状态。
【讨论】:
以上是关于oracle.jdbc.autoCommitSpecCompliant VS setAutoCommit(false)的主要内容,如果未能解决你的问题,请参考以下文章