我一直在瀏覽一段時間,並在過程中咀嚼我的帽子,但無法找到與我的問題完全匹配的東西。
簡而言之,在60秒的不活動狀態下,我得到了極好的堆棧跟蹤(org.apache.tomcat.jdbc.pool.ConnectionPool放棄),這對於幾個服務器端線程來說是正常行爲。
我使用的Tomcat JDBC連接池(org.apache.tomcat.jdbc.pool.DataSource)直接
堆棧跟蹤:WebApp(Tomcat-jdbc)聯合數據庫連接拋棄異常
Oct 29, 2012 8:55:50 PM org.apache.tomcat.jdbc.pool.ConnectionPool abandon WARNING: Connection has been abandoned PooledConnection[[email protected]]:java.lang.Exception at org.apache.tomcat.jdbc.pool.ConnectionPool.getThreadDump(ConnectionPool.java:967) at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:721) at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:579) at org.apache.tomcat.jdbc.pool.ConnectionPool.getConnection(ConnectionPool.java:174) at org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:111) at com.getsom.getConnection(DAO.java:1444) at com.getsom.PreparedConnection.(PreparedConnection.java:48) at com.getsom.Alarms.run(Alarms.java:492)
我PoolProperties配置如下:
PoolProperties pp = new PoolProperties();
pp.setUrl(someValidUrl);
pp.setDriverClassName("com.mysql.jdbc.Driver");
pp.setUsername(someUser);
pp.setPassword(somePassword);
pp.setJmxEnabled(true);
pp.setTestWhileIdle(true);
pp.setTestOnBorrow(true);
pp.setValidationQuery("SELECT 1");
pp.setTestOnReturn(false);
pp.setValidationInterval(30000);
pp.setTimeBetweenEvictionRunsMillis(30000);
pp.setMaxActive(100);
pp.setInitialSize(10);
pp.setMaxWait(10000);
pp.setMinEvictableIdleTimeMillis(30000);
pp.setMinIdle(10);
pp.setLogAbandoned(true);
pp.setRemoveAbandoned(true);
pp.setRemoveAbandonedTimeout(60);
pp.setJdbcInterceptors("org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;"+
"org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer");
setPoolProperties(pp);
我希望setValidationInterval(30000)能夠救我,因爲30s在連接生命週期中並不多。無論如何,問題是:
我錯過了什麼讓這個連接永遠活着?
一個很好的瞭解:爲什麼我在聲稱連接的函數中超時,儘管它在30秒之前被調用。
一年回答,兩年接受:) – MonoThreaded
這個答案也是我的解決方案!感謝你們! – Samarland