2012-07-09 7 views
5

Bazı garip bir sorun var.Bir bağlantı havuzu kullanarak bir süre sonra otomatik olarak değişiklik TRUE değişiklikleri

DB Bağlantıları oluşturmak ve yönetmek için bir Havuz kullanıyorum, DefaultAutocommit seçeneğini FALSE olarak ayarladım.

Fakat bir süre sonra

bir hata oluşur ve bir rollback İstisna atılır çağrıldığında: Can't call rollback when autocommit=true

yeni DataSource oluşturulacaktır olarak JBoss sorunu çözecektir yeniden başlatılacaktır. İşte

benim Datasource oluşturmak nasıl:

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); 
} 

Ve bağlantıları olsun nasıl:

xxx.getDataSource().getConnection(); 
Henüz deneyin vermedi

ama benim ilk çağrı özdevinimli doğrudan zorlamak olacaktır setAutoCommit(false) kullanarak bağlantı.

poolProperties.setDefaultAutoCommit(false);'un neden işi durdurduğunu anlamıyorum.

Yığın izleme: Yani burada

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

sen verebilir misiniz hata yığın izleme? –

+0

Büyük olasılıkla bağlantı havuzunda veya MySQL JDBC sürücüsündeki bir hata. Bunun dışında, bu sorunun cevapsız olduğunu düşünüyorum. –

+0

@MarkRotteveel Peki, böyle bir hatanın izini bulamadım. Ancak, özniteliği doğrudan bağlantıya zorlamaya çalışacağız. Bu işe yararsa başkalarına yardımcı olabilir. –

cevap

2

yerde bugün budur, ben havuz oluşturulan her bağlantıda AutoCommit niteliği zorlar.

Bu, bu nedenle havuz sınıflarının bir hatası olabileceği için çalışır.

Düzenleme: Aynı şekilde ayarlanmış ancak dikkate alınmayan işlem yalıtımıyla ilgili de bir sorun yaşadım. Bazı araştırmalardan sonra bunun Mysql konnektörü/J I kullanımı ile ilişkili olabileceğini buldum (http://dev.mysql.com/doc/refman/5.1/en/connector-j-reference-configuration-properties.html). (

sürücü Connection.setAutoCommit tarafından belirlenir autocommit ve işlem izolasyon iç değerlerine atıfta Should

useLocalSessionState) ve:

ben doc bu ilginç parametreyi bulundu Connection.setTransactionIsolation() ve arasındaki iletişim durumu, veritabanı tarafından sorgulanmaktan ziyade protokol tarafından tutulur veya veritabanına körü körüne gönderme komutları commit() veya ro llback() yöntem çağrıları?

Varsayılan değer: yanlış

İlgili konular