[ https://issues.apache.org/jira/browse/AMQ-4836?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Timothy Bish resolved AMQ-4836. ------------------------------- Resolution: Fixed Fix Version/s: 5.11.0 This is resolved with the fixes in AMQ-5318 > Calling Connection.commit() on a Connection with setAutoCommit(true) throws > SQLException > ---------------------------------------------------------------------------------------- > > Key: AMQ-4836 > URL: https://issues.apache.org/jira/browse/AMQ-4836 > Project: ActiveMQ > Issue Type: Bug > Components: Message Store > Affects Versions: 5.7.0 > Environment: JDK 1.6.0_45, Firebird or HDB (SAP HANA DB) configured > as a persistent storage > Reporter: Jiri Patera > Fix For: 5.11.0 > > > This issue is similar to AMQ-577 (resolved by adding a MSSQL JDBC URL > parameter) and AMQ-711 (resolved as cannot reproduce) issues. > The problem is that the JDBC API (the {{Connection}} class JavaDoc) states: > {code} > /** > * Makes all changes made since the previous > * commit/rollback permanent and releases any database locks > * currently held by this <code>Connection</code> object. > * This method should be > * used only when auto-commit mode has been disabled. > * > * @exception SQLException if a database access error occurs, > * this method is called while participating in a distributed transaction, > * if this method is called on a closed conection or this > * <code>Connection</code> object is in auto-commit mode > * @see #setAutoCommit > */ > void commit() throws SQLException; > {code} > However, some JDBC drivers do not throw the {{SQLException}} when the > {{Connection.commit()}} method is called on a {{Connection}} instance with > {{setAutoCommit(true)}}. Some others do (Firebird, SAP-HANA, MSSQL without > the JDBC URL parameter {{relaxAutoCommit=true}}). With these databases the > following exceptions can be thrown on the Broker start-up: > 1) {{DefaultJDBCAdapter.doDropTables(DefaultJDBCAdapter.java:148)}}: > {code} > Caused by: com.sap.db.jdbc.exceptions.JDBCDriverException: SAP DBTech JDBC: > Connection is currently in auto commit mode. > at > com.sap.db.jdbc.exceptions.SQLExceptionSapDB.createException(SQLExceptionSapDB.java:334) > at > com.sap.db.jdbc.exceptions.SQLExceptionSapDB.generateSQLException(SQLExceptionSapDB.java:113) > at com.sap.db.jdbc.ConnectionSapDB.commit(ConnectionSapDB.java:351) > at com.sap.db.jdbc.trace.Connection.commit(Connection.java:126) > at > org.apache.commons.dbcp.DelegatingConnection.commit(DelegatingConnection.java:334) > at > org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.commit(PoolingDataSource.java:211) > at > org.apache.activemq.store.jdbc.adapter.DefaultJDBCAdapter.doDropTables(DefaultJDBCAdapter.java:148) > at > org.apache.activemq.store.jdbc.adapter.OptimizedDefaultJDBCAdapter.doDropTables(OptimizedDefaultJDBCAdapter.java:68) > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) > at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) > at java.lang.reflect.Method.invoke(Method.java:597) > at > org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:309) > at > org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183) > at > org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) > at > org.springframework.aop.interceptor.AbstractTraceInterceptor.invoke(AbstractTraceInterceptor.java:113) > at > org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) > at > org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202) > at com.sun.proxy.$Proxy12.doDropTables(Unknown Source) > at > org.apache.activemq.store.jdbc.JDBCPersistenceAdapter.deleteAllMessages(JDBCPersistenceAdapter.java:526) > ... 64 more > {code} > 2) {{DefaultJDBCAdapter.doCreateTables(DefaultJDBCAdapter.java:119)}} > {code} > Caused by: com.sap.db.jdbc.exceptions.JDBCDriverException: SAP DBTech JDBC: > Connection is currently in auto commit mode. > at > com.sap.db.jdbc.exceptions.SQLExceptionSapDB.createException(SQLExceptionSapDB.java:334) > at > com.sap.db.jdbc.exceptions.SQLExceptionSapDB.generateSQLException(SQLExceptionSapDB.java:113) > at com.sap.db.jdbc.ConnectionSapDB.commit(ConnectionSapDB.java:351) > at com.sap.db.jdbc.trace.Connection.commit(Connection.java:126) > at > org.apache.commons.dbcp.DelegatingConnection.commit(DelegatingConnection.java:334) > at > org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.commit(PoolingDataSource.java:211) > at > org.apache.activemq.store.jdbc.adapter.DefaultJDBCAdapter.doCreateTables(DefaultJDBCAdapter.java:119) > at > org.apache.activemq.store.jdbc.adapter.OptimizedDefaultJDBCAdapter.doCreateTables(OptimizedDefaultJDBCAdapter.java:62) > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) > at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) > at java.lang.reflect.Method.invoke(Method.java:597) > at > org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:309) > at > org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183) > at > org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) > at > org.springframework.aop.interceptor.AbstractTraceInterceptor.invoke(AbstractTraceInterceptor.java:113) > at > org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) > at > org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202) > at com.sun.proxy.$Proxy12.doCreateTables(Unknown Source) > at > org.apache.activemq.store.jdbc.JDBCPersistenceAdapter.deleteAllMessages(JDBCPersistenceAdapter.java:528) > ... 64 more > {code} > This led us to a workaround where we simply override the 1) and 2) methods > and replaced the following code in them: > {code} > c.getConnection().commit(); > {code} > With the following code (to prevent the exceptions from being thrown): > {code} > if (!c.getConnection().getAutoCommit()) { /* HACK */ > c.getConnection().commit(); > } > {code} > I believe that the ActiveMQ code should correspond to the JDBC API > specification by calling the {{Connection.commit()}} method only on > connections with {{setAutoCommit(false)}}. This approach is already > implemented in the ActiveMQ code, for example, in the following method: > {code} > org.apache.activemq.store.jdbc.TransactionContext.commit() > {code} -- This message was sent by Atlassian JIRA (v6.2#6252)