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)的主要内容,如果未能解决你的问题,请参考以下文章