我正在使用Maven在Tomcat 8上開發一個Web應用程序,我正在使用c3p0來處理主線程和另外兩個併發線程上的連接,我的連接管理器類在問一個DataSource單例類我爲同步連接實現的,像這樣Tomcat8 + c3p0,連接正在被中斷並自動關閉
public synchronized Connection getConnection() {
try {
return cpds.getConnection();
} catch (SQLException ex) {
logger.error("Error while issuing a pooled connection", ex);
}
return null;
}
,但是當我試圖用他們開始這些連接要麼中斷
09:47:17.164 [QuartzScheduler_Worker-4] ERROR com.myapp.providers.DataSource - Error while issuing a pooled connection
java.sql.SQLException: An SQLException was provoked by the following failure: java.lang.InterruptedException
at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:106) ~[c3p0-0.9.1.2.jar:0.9.1.2]
at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:65) ~[c3p0-0.9.1.2.jar:0.9.1.2]
at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:62) ~[c3p0-0.9.1.2.jar:0.9.1.2]
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:531) ~[c3p0-0.9.1.2.jar:0.9.1.2]
at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:128) ~[c3p0-0.9.1.2.jar:0.9.1.2]
或接近中等交易和打破任何陳述和結果集E是當時使用的
我配置像這樣
cpds = new ComboPooledDataSource();
cpds.setDriverClass(oracle.jdbc.driver.OracleDriver);
cpds.setJdbcUrl(jdbc:oracle:thin:@xx.xxx.xxx.xxx:1521:XE);
cpds.setUser("username");
cpds.setPassword("password");
// database connection properties
cpds.setInitialPoolSize(10);
cpds.setAcquireIncrement(3);
cpds.setMaxPoolSize(100);
cpds.setMinPoolSize(15);
cpds.setMaxStatements(75);
// connection pool preferences
cpds.setIdleConnectionTestPeriod(60);
cpds.setMaxIdleTime(30000);
cpds.setAutoCommitOnClose(false);
cpds.setPreferredTestQuery("SELECT 1 FROM DUAL");
cpds.setTestConnectionOnCheckin(false);
cpds.setTestConnectionOnCheckout(false);
cpds.setAcquireRetryAttempts(30);
cpds.setAcquireRetryDelay(1000);
cpds.setBreakAfterAcquireFailure(false);
DataSource對象我也寫的是在一個循環中運行,並查詢數據庫n次,但該作品一個小的測試方法精細。
您的crp0配置在哪裏? –
我以編程的方式對其進行配置,我將在短時間內對其進行編輯 – svarog
以及@Steve Waldman的回答,他指向一個已被絞死的線程,所以您是否使用不同的線程來打開連接並使用連接 ?如果你在一個線程中使用連接,這個線程不是上下文感知的(意味着tomcat不知道它的存在),當另一個線程要求連接池時,tomcat積極地中斷第一個線程來傳遞連接第二個線程 – AntJavaDev