最近公司一个JDK1.4的老项目升级了JDK1.6后BUG不断,最可恶的连接池被占满。
因为是使用tomcat的连接池所以在config下中添加
<Resource name="jdbc/****" auth="Container"
type="javax.sql.DataSource"
username="****"
password="*****"
driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
url="jdbc:sqlserver://*******"
maxActive="200"
maxIdle="50"
maxWait="600000"
logAbandoned="true"
removeAbandoned="true"
removeAbandonedTimeout="600"
/>
这样tomcat会打印出未关闭的数据库连接的代码块。
logAbandoned="true"
是开启打印回收连接日志
removeAbandonedTimeout="600"
是设置连接超时时间,注意单位是秒
removeAbandoned="true"
是数据库连接不够用回收超时的连接
通过tomcat打印的日志可以找到未关闭连接的代码块
org.apache.tomcat.dbcp.dbcp.AbandonedTrace$AbandonedObjectException: DBCP object created 2016-10-10 11:01:47 by the following code was never closed: at org.apache.tomcat.dbcp.dbcp.AbandonedTrace.init(AbandonedTrace.java:9 0) at org.apache.tomcat.dbcp.dbcp.AbandonedTrace.<init>(AbandonedTrace.java :73) at org.apache.tomcat.dbcp.dbcp.DelegatingResultSet.<init>(DelegatingResu ltSet.java:81) at org.apache.tomcat.dbcp.dbcp.DelegatingResultSet.wrapResultSet(Delegat ingResultSet.java:104) at org.apache.tomcat.dbcp.dbcp.DelegatingStatement.executeQuery(Delegati ngStatement.java:208) at org.apache.tomcat.dbcp.dbcp.DelegatingStatement.executeQuery(Delegati ngStatement.java:208) at org.apache.jsp.*****************.appformlist_jsp._jspService(ap pformlist_jsp.java:1317)
从上可以看到appformlist_jsp的1317行没有关闭
利用反编译工具找到tomcat的work目录下的appformlist_jsp.class
关闭这位置数据库连接。