日期:2014-05-17  浏览次数:20763 次

求教:关于DBCP连接池的问题
运行环境:tomcat5.5 + sql server 2000 sp3 + jdk1.5,
tomcat和数据库在不同的服务器上

问题描述:运行一段时间后(一般是一两天)在重启应用程序时报以下错误
java.sql.SQLException: Network error IOException: Address already in use: connect
at net.sourceforge.jtds.jdbc.ConnectionJDBC2.<init>(ConnectionJDBC2.java:371)
at net.sourceforge.jtds.jdbc.ConnectionJDBC3.<init>(ConnectionJDBC3.java:50)
at net.sourceforge.jtds.jdbc.Driver.connect(Driver.java:188)
at org.apache.tomcat.dbcp.dbcp.DriverConnectionFactory.createConnection(DriverConnectionFactory.java:37)
at org.apache.tomcat.dbcp.dbcp.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:290)
at org.apache.tomcat.dbcp.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:771)
at org.apache.tomcat.dbcp.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:95)
at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:540)

个人分析认为:由于WEB服务器与数据库服务器的网络不稳定,中途出现连接池中存在没关闭的连接就与数据库断开网络。
求解决办法。

也有可能原因分析不对,欢迎拍砖

------解决方案--------------------
或许这对你有用
http://support.microsoft.com/kb/328476/zh-cn
------解决方案--------------------
是每次都出现那样的问题吗?

LZ 在重启之前先执行下 shutdown.bat 呢 ..
------解决方案--------------------
数据库的链接需要严重对待。
否则就很容易出现资源消耗严重,连接数满了等的问题。
tomcat可以使用自带连接池的处理。
建议使用proxool,这个东西还是比较简单好用。


------解决方案--------------------
至于你这个问题,需要具体看代码。
没准你在哪个地方哪个东西没有关闭,又企图再次调用。比如循环嵌套中的 statement等。

另外一个就是藏得比较深的问题。
建议读http://support.microsoft.com/kb/328476/zh-cn文中的调整 WinsockListenBacklog 设置
段落。
检查并尝试。或许有帮助。
------解决方案--------------------
应该是连接有泄漏,把手工的操作写成测试脚本做个压力测试,然后观察连接池里的连接状态,以及数据库的连接状态