2012-07-09 17 views
5

Tengo un problema extraño.Confirmación automática cambia a VERDADERO después de un tiempo usando un grupo de conexión

Utilizo un grupo para crear y administrar las conexiones de base de datos. Configuré la opción DefaultAutocommit en FALSE.

Pero después de un tiempo, cuando se produce un error y una rollback se llama produce una excepción: Can't call rollback when autocommit=true

Relanzamiento JBoss va a resolver el problema, ya que se creará una nueva fuente de datos.

Así es como puedo crear mi fuente de datos:

protected DataSource getDataSource(String driverClassName, String dbUrl, String dbUser, String dbPwd) { 
    PoolProperties poolProperties = new PoolProperties(); 
    poolProperties.setUrl(dbUrl); 
    poolProperties.setDriverClassName(driverClassName); 
    poolProperties.setUsername(dbUser); 
    poolProperties.setPassword(dbPwd); 

    poolProperties.setDefaultAutoCommit(false); 
    poolProperties.setTestWhileIdle(false); 
    poolProperties.setTestOnBorrow(true); 
    poolProperties.setDefaultTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED); 
    poolProperties.setValidationQuery("SELECT 1"); 
    poolProperties.setTestOnReturn(false); 
    poolProperties.setLogAbandoned(false); 
    poolProperties.setRemoveAbandoned(true); 
    poolProperties.setRemoveAbandonedTimeout(20); 
    poolProperties.setMaxActive(100); 
    poolProperties.setInitialSize(10); 
    poolProperties.setJdbcInterceptors("org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer"); 

    return new DataSource(poolProperties); 
} 

Y cómo consigo las conexiones:

xxx.getDataSource().getConnection(); 

No he intentado todavía, pero mi primera llamada será para forzar la confirmación automática directamente en la conexión usando setAutoCommit(false).

Aunque no entiendo por qué el poolProperties.setDefaultAutoCommit(false); se está deteniendo haciendo el trabajo.

Seguimiento de la pila:

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Can't call rollback when autocommit=true 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513) 
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:409) 
    at com.mysql.jdbc.Util.getInstance(Util.java:384) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1015) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:984) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:929) 
    at com.mysql.jdbc.ConnectionImpl.rollback(ConnectionImpl.java:4805) 
    at sun.reflect.GeneratedMethodAccessor302.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.apache.tomcat.jdbc.pool.ProxyConnection.invoke(ProxyConnection.java:125) 
    at org.apache.tomcat.jdbc.pool.JdbcInterceptor.invoke(JdbcInterceptor.java:94) 
    at org.apache.tomcat.jdbc.pool.interceptor.AbstractCreateStatementInterceptor.invoke(AbstractCreateStatementInterceptor.java:71) 
    at org.apache.tomcat.jdbc.pool.JdbcInterceptor.invoke(JdbcInterceptor.java:94) 
    at org.apache.tomcat.jdbc.pool.interceptor.ConnectionState.invoke(ConnectionState.java:140) 
    at $Proxy333.rollback(Unknown Source) 
+0

Podría dar seguimiento de la pila de error? –

+0

Lo más probable es que se trate de un error en el grupo de conexiones o en el controlador JDBC de MySQL. Aparte de eso, creo que esta pregunta no tiene respuesta. –

+0

@MarkRotteveel Bueno, no encontré ningún rastro de tal error. Pero intentaremos forzar el atributo en la conexión directamente. Puede ayudar a otros si ese trabajo. –

Respuesta

2

Así que aquí es lo que está en su lugar hoy, forzar el atributo AutoCommit en cada conexión creada en la piscina.

Esto funciona, por lo que definitivamente puede ser un error de las clases de grupo.

Edit: También tuve un problema con el aislamiento de transacciones que se estableció de la misma manera pero no se tuvo en cuenta. Después de investigar, descubrí que esto podría estar relacionado con el conector/J de Mysql que uso (http://dev.mysql.com/doc/refman/5.1/en/connector-j-reference-configuration-properties.html).

I conocer este parámetro interesante en el doc:

useLocalSessionState

caso de que el conductor se refieren a los valores internos de confirmación automática y aislamiento de transacción que son fijados por Connection.setAutoCommit() y Connection.setTransactionIsolation() y estado de transacción como mantenido por el protocolo, en lugar de consultar la base de datos o enviando comandos a ciegas a la base de datos para commit() o ro llback() llamadas de método?

Valor por defecto: falsa

Cuestiones relacionadas