1 現象com.alibaba.druid.pool.GetConnectionTimeoutException: loopWaitCount 0, wait millis 60011
at com.alibaba.druid.pool.DruidDataSource.pollLast(DruidDataSource.java:1068)
at com.alibaba.druid.pool.DruidDataSource.getConnectionInternal(DruidDataSource.java:748)
at com.alibaba.druid.pool.DruidDataSource.getConnectionDirect(DruidDataSource.java:640)
at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:624)
at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:614)
at cn.egame.common.data.dbpool.ConnectionManager.getConnection(ConnectionManager.java:33)
at cn.egame.common.data.BaseDao.getConnection(BaseDao.java:142)
at cn.egame.common.data.BaseDao.getObject(BaseDao.java:462)
at cn.egame.common.data.BaseDao.getInt(BaseDao.java:233)
at cn.egame.core.gc.TerminalServiceDao.getTerminalIdByUACode(TerminalServiceDao.java:30)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:155)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
at java.lang.Thread.run(Thread.java:662)
根據GetConnectionTimeoutException此異常,初步懷疑:(1) mysql串連不上,排查通mysql過mysql用戶端能夠串連上mysql,
且mysql的串連數並未被佔滿。
(2)串連泄露2 分析 System.out.println("pool dump : " + pool.dump());
//pool是DruidDataSource列印資訊:pool dump :{ CreateTime:"2013-06-08 19:23:38", ActiveCount:200, PoolingCount:0,
CreateCount:319, DestroyCount:119, CloseCount:201403, ConnectCount:213737, Connections:[ ]}
ActiveCount:當前被佔用的串連數,設定檔中MaxActive=200,最大串連數設定為200。PoolingCount:閑置的串連數。結論:druid串連泄露。
3 排查pool.setRemoveAbandoned(true);//會影響效能,只有在排查串連泄露的時候,才開啟 System.out.println("activeStackTrace : "+
pool.getActiveConnectionStackTrace());//pool.setRemoveAbandoned(true)設定為true的時候,才有活躍串連的堆棧資訊,
不然後沒有列印資訊:activeStackTrace : [java.lang.Thread.getStackTrace(Thread.java:1436)com.alibaba.druid.pool.DruidDataSource.getConnectionDirect(DruidDataSource.java:678)
com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:624)
com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:614)
cn.egame.common.data.dbpool.ConnectionManager.getConnection(ConnectionManager.java:35)
cn.egame.common.data.BaseDao.getConnection(BaseDao.java:142)cn.egame.common.data.BaseDao.main(BaseDao.java:33),
java.lang.Thread.getStackTrace(Thread.java:1436)com.alibaba.druid.pool.DruidDataSource.getConnectionDirect(DruidDataSource.java:678)
com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:624)
com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:614)
cn.egame.common.data.dbpool.ConnectionManager.getConnection(ConnectionManager.java:35)
cn.egame.common.data.BaseDao.getConnection(BaseDao.java:142)cn.egame.common.data.BaseDao.main(BaseDao.java:34)]
我們就可以根據活躍串連的堆棧資訊,看到具體的哪個業務方法持有了串連未釋放。