我只是从classes12.jar升级到新的jdbc驱动程序到ojdbc7.jar
我的应用程序在运行ojdbc7.jar时抛出异常:
java.sql.SQLException: Could not commit with auto-commit set on
at oracle.jdbc.driver.PhysicalConnection.commit(PhysicalConnection.java:4443)
at oracle.jdbc.driver.PhysicalConnection.commit(PhysicalConnection.java:4490)
at oracle.jdbc.driver.T4CConnection.doSetAutoCommit(T4CConnection.java:943)
at oracle.jdbc.driver.PhysicalConnection.setAutoCommit(PhysicalConnection.java:4
我的应用程序仍然可以使用classes12.jar正常运行。
我研究过oracle:
以下任何一种情况都会引发此异常:
但我无法在我的来源中发现错误。请帮我解释一下这个错误。
答案 0 :(得分:17)
最新的OJDBC驱动程序比它们更符合要求。您可以为遗留代码关闭此行为:
-Doracle.jdbc.autoCommitSpecCompliant=false
这是一个JVM选项。
答案 1 :(得分:6)
当使用Oracle JDBC驱动程序(ojdbc6.jar)版本12或更高版本时,会发生此类异常。驱动程序的12及更高版本比早期的驱动程序版本更严格。
你可以解决问题,你有几个选择:
使用以下JVM参数设置覆盖新jar版本(ojdbc6.jar)的行为。
-Doracle.jdbc.autoCommitSpecCompliant =假
IBM WAS用户,请参阅this link:
在Java / SQL中设置自动提交:
爪哇:
conn.setAutoCommit(假);
甲骨文:
SET AUTOCOMMIT OFF
答案 2 :(得分:0)
我们是使用ojbc6.jar的IBM WAS v9,上面的配置应用于APP Server,Node agent和DMGR,然后它可以工作。
-Doracle.jdbc.autoCommitSpecCompliant=false
Dmgr: 部署管理器>流程定义> Java虚拟机 修改“通用JVM参数”
NodeAgent: 节点代理> nodeagent>流程定义> Java虚拟机
WebSphere Application Server: 应用程序服务器> WebSphere_Portal>流程定义> Java虚拟机 修改“通用JVM参数”
答案 3 :(得分:0)
ojdbc6中的PhysicalConnector.java
public void commit(int paramInt) throws SQLException {
disallowGlobalTxnMode(114);
if (this.lifecycle != 1) {
SQLException sQLException = DatabaseError.createSqlException(getConnectionDuringExceptionHandling(), 8);
sQLException.fillInStackTrace();
throw sQLException;
}
.
.
ojdbc7中的PhysicalConnector.java
public void commit(int paramInt) throws SQLException {
disallowGlobalTxnMode(114);
if (this.autoCommitSpecCompliant && getAutoCommit()) {
throw (SQLException)DatabaseError.createSqlException(getConnectionDuringExceptionHandling(), 273).fillInStackTrace();
}
if (this.lifecycle != 1) {
SQLException sQLException = DatabaseError.createSqlException(getConnectionDuringExceptionHandling(), 8);
sQLException.fillInStackTrace();
throw sQLException;
}
.
.
我们可以看到,在ojdbc7中,已经引入了一些代码。如果autoCommitSpecCompliant
和getAutoCommit()
都为真,我们将得到例外。
将autoCommitSpecCompliant设置为false
下面要设置的JVM参数
-Doracle.jdbc.autoCommitSpecCompliant=false
在connection.commit()
connection.setAutoCommit(false);
答案 4 :(得分:-1)
在Hibernate属性中更改此功能对我有用
hibernate.connection.release_mode =自动