最近在做一个小项目,开发环境:数据库mysql5.0,服务器Tomcat5.5。项目打成war部署在tomcat上之后,通过应用进行查询操作,如果操作过于频繁,后台会抛如下异常:
javax.servlet.ServletException: Hibernate operation: Cannot open connection; uncategorized SQLException for SQL [???]; SQL state [08S01]; error code [0]; Communications link failure due to underlying exception:
** BEGIN NESTED EXCEPTION **
java.net.SocketException
MESSAGE: java.net.BindException: Address already in use: connect
STACKTRACE:
java.net.SocketException: java.net.BindException: Address already in use: connect
at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:156)
at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:284)
at com.mysql.jdbc.Connection.createNewIO(Connection.java:2569)
at com.mysql.jdbc.Connection.<init>(Connection.java:1485)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:266)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriverManager(DriverManagerDataSource.java:291)
at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriverManager(DriverManagerDataSource.java:277
。。。。。。
在网上查了很多资料,也在论坛里发帖提问,发现是连接数占用的问题。应用里连接采用的是JDBC直连,后来改成了通过缓冲池连接。
换成缓冲池连接的时候,程序打包要注意,程序lib下的naming-factory.jar,naming-factory-dbcp.jar,naming-resources.jar都要删掉,mysql的连接jar包也要删掉,之后再打包。同时还要注意,tomcat的common lib下要有mysql连接的jar包。然后再部署程序,启动,就ok了。
究其原因,是全局和局部的问题。配置缓冲池连接这种方式,需要全局(tomcat的lib下有相关的jar包);如果采用jdbc直连,就需要程序的war包里有上述那几个jar包。
记录在此,以备后用。