का उपयोग करते हुए कुछ समय बाद TRUE में स्वतः बदलाव करें मुझे कुछ अजीब समस्या मिली है।कनेक्शन पूल
मैं डीबी कनेक्शन बनाने और प्रबंधित करने के लिए पूल का उपयोग करता हूं, मैंने DefaultAutocommit
विकल्प FALSE
पर सेट किया है।
लेकिन कुछ समय के बाद, एक त्रुटि पाए जाते हैं और एक rollback
कहा जाता है एक अपवाद उत्पन्न होती है जब: Can't call rollback when autocommit=true
पुन: लॉन्च करने JBoss समस्या का समाधान होगा के रूप में एक नया डेटा स्रोत बनाया जाएगा।
यहाँ कैसे मैं अपने डेटा स्रोत बनाने है:
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);
}
और कैसे मैं कनेक्शन मिलता है:
xxx.getDataSource().getConnection();
मैं अभी तक की कोशिश नहीं की, लेकिन मेरी पहली कॉल autocommit सीधे मजबूर करने के लिए किया जाएगा setAutoCommit(false)
का उपयोग कर कनेक्शन पर।
हालांकि मुझे समझ में नहीं आता कि poolProperties.setDefaultAutoCommit(false);
नौकरी क्यों रोक रहा है।
स्टैक ट्रेस:
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)
उपलब्ध कराने जा सका त्रुटि स्टैक ट्रेस? –
सबसे अधिक संभावना है कि यह कनेक्शन पूल या MySQL जेडीबीसी ड्राइवर में एक बग है। इसके अलावा, मुझे लगता है कि यह सवाल असंभव है। –
@MarkRotteveel खैर मुझे इस तरह की एक बग का कोई निशान नहीं मिला। लेकिन हम कनेक्शन पर विशेषता को सीधे बल देने की कोशिश करेंगे। यह काम करने पर अन्य मदद कर सकता है। –