Reputation: 271
I just upgrade to new jdbc driver from classes12.jar to ojdbc7.jar
My app threw an exception when was running with 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
My app still run normally with classes12.jar.
I researched on oracle:
This exception is raised for any one of the following cases:
But i couldn't find mistake in my source. Please help me give more explaination about this error.
Upvotes: 25
Views: 106687
Reputation: 19237
There's another solution that you can do from code:
System.setProperty("oracle.jdbc.autoCommitSpecCompliant", "false");
Upvotes: 1
Reputation: 1475
PhysicalConnector.java in ojdbc6
public void commit(int paramInt) throws SQLException {
disallowGlobalTxnMode(114);
if (this.lifecycle != 1) {
SQLException sQLException = DatabaseError.createSqlException(getConnectionDuringExceptionHandling(), 8);
sQLException.fillInStackTrace();
throw sQLException;
}
.
.
PhysicalConnector.java in ojdbc7
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;
}
.
.
We can see that in ojdbc7, there is some piece of code has been introduced. If autoCommitSpecCompliant
and getAutoCommit()
both are true, we will be getting exception.
set autoCommitSpecCompliant false
Below JVM parameter to be set
-Doracle.jdbc.autoCommitSpecCompliant=false
insert below piece of code before connection.commit()
connection.setAutoCommit(false);
Upvotes: 8
Reputation: 1
We are IBM WAS v9 with using ojbc6.jar Above configure applied to APP Server, Node agent and DMGR, then it works.
-Doracle.jdbc.autoCommitSpecCompliant=false
Dmgr: Deployment manager > Process definition > Java Virtual Machine Modify "Generic JVM arguments"
NodeAgent: Node agents > nodeagent > Process definition > Java Virtual Machine
WebSphere Application Server: Application servers > WebSphere_Portal > Process definition > Java Virtual Machine Modify "Generic JVM arguments"
Upvotes: 0
Reputation: 449
Changing this in Hibernate properties worked for me
hibernate.connection.release_mode=auto
Upvotes: -1
Reputation: 1700
This kind of exceptions occur when the Oracle JDBC Driver (ojdbc6.jar) version 12 or above will be used. Version 12 and above of the driver is more strictly than earlier driver versions.
You can solve the problem, you have few options:
Override behavior of new jar version(ojdbc6.jar) with setting below JVM arguments.
-Doracle.jdbc.autoCommitSpecCompliant=false
IBM WAS users, refer this link:
Set Auto Commit off in Java/SQL:
Java:
conn.setAutoCommit(false);
Oracle:
SET AUTOCOMMIT OFF
Upvotes: 14
Reputation: 4874
The latest OJDBC drivers are more compliant then they where. You can turn off this behavior for legacy code:
-Doracle.jdbc.autoCommitSpecCompliant=false
It's a JVM option.
Upvotes: 29