我的代码是用jruby编写的,我使用warbler在tomcat中部署。我正在使用SEQUEL来查询mysql数据库。我正在使用两层数据库连接池。一个是本地SEQUEL池,另一个是在tomcat级别的JNDI池。连接字符串是:面对NativeException:java.sql.SQLException:连接[email protected]已关闭
DB = Sequel.connect("jdbc:jndi:java:comp/env/test", :logger => $db_log, :max_connections => 10)
此连接字符串在app.rb其中被加载时,才会有新的部署或Tomcat启动定义。这将创建一个续集连接池,并且所有线程共享此池。 在我的$ CATALINA_OME/conf/context.xml文件的JNDI配置如下:
<Resource
name="test"
auth="Container"
type="javax.sql.DataSource"
maxActive="10"
maxIdle="5"
maxWait="9000"
username="test_db"
password="test_db"
driverClassName="com.mysql.jdbc.Driver"
testOnBorrow="true"
testWhileIdle="true"
validationQuery="SELECT 1" testOnReturn="true"
timeBetweenEvictionRunsMillis="300000" removeAbandonedTimeout="60"
removeAbandoned="true"
logAbandoned="true"
url="jdbc:mysql://IP:3306/test"
/>
我使用DB.disconnect返回JNDI池连接,以确保没有线程使用的是先前用于连接。我正在这样做,以确保wait_timeout错误。 “auto_reconnect = true”似乎没有正确解决wait_timeout问题。 一切都是直到几天工作正常,回来时,我突然开始得到这样的错误:
W, [2012-07-26T05:10:30.999000 #29456] WARN -- : 134325951259087 == NativeException: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
D, [2012-07-26T05:10:31.001000 #29456] DEBUG -- : 134325951259087 == ["sun.reflect.GeneratedConstructorAccessor23:-1:in `newInstance'", "sun/reflect/DelegatingConstructorAccessorImpl.java:27:in `newInstance'", "java/lang/reflect/Constructor.java:513:in `newInstance'", "com/mysql/jdbc/Util.java:409:in `handleNewInstance'", "com/mysql/jdbc/SQLError.java:1118:in `createCommunicationsException'", "com/mysql/jdbc/MysqlIO.java:343:in `<init>'", "com/mysql/jdbc/ConnectionImpl.java:2308:in `connectOneTryOnly'", "com/mysql/jdbc/ConnectionImpl.java:2122:in `createNewIO'", "com/mysql/jdbc/ConnectionImpl.java:774:in `<init>'", "com/mysql/jdbc/JDBC4Connection.java:49:in `<init>'", "sun.reflect.GeneratedConstructorAccessor25:-1:in `newInstance'", "sun/reflect/DelegatingConstructorAccessorImpl.java:27:in `newInstance'", "java/lang/reflect/Constructor.java:513:in `newInstance'", "com/mysql/jdbc/Util.java:409:in `handleNewInstance'"
&
W, [2012-07-26T10:19:14.029000 #1572] WARN -- : 134327815053548 == NativeException: java.sql.SQLException: Connection [email protected] is closed.
D, [2012-07-26T10:19:14.030000 #1572] DEBUG -- : 134327815053548 == ["org/apache/tomcat/dbcp/dbcp/DelegatingConnection.java:398:in `checkOpen'", "org/apache/tomcat/dbcp/dbcp/DelegatingConnection.java:255:in `createStatement'", "file:/usr/local/tomcat-instance/test/webapps/service/WEB-INF/lib/santa-gems.jar!/gems/sequel-3.34.0/lib/sequel/adapters/jdbc.rb:523:in `statement'", "file:/usr/local/tomcat-instance/test/webapps/service/WEB-INF/lib/santa-gems.jar!/gems/sequel-3.34.0/lib/sequel/adapters/jdbc.rb:233:in `execute'", "file:/usr/local/tomcat-instance/test/webapps/service/WEB-INF/lib/santa-gems.jar!/gems/sequel-3.34.0/lib/sequel/connection_pool/threaded.rb:88:in `hold'", "file:/usr/local/tomcat-instance/test/webapps/service/WEB-INF/lib/santa-gems.jar!/gems/sequel-3.34.0/lib/sequel/database/connecting.rb:234:in `synchronize'", "file:/usr/local/tomcat-instance/testv/webapps/service/WEB-INF/lib/santa-gems.jar!/gems/sequel-3.34.0/lib/sequel/adapters/jdbc.rb:232:in `execute'", "file:/usr/local/tomcat-instance/test/webapps/service/WEB-INF/lib/santa-gems.jar!/gems/sequel-3.34.0/lib/sequel/dataset/actions.rb:744:in `execute'", "file:/usr/local/tomcat-instance/test/webapps/service/WEB-INF/l
而且,这些错误也经常发生被忽略。 发生在没有任何错误的时间和现在是数据库主机的变化之间发生的唯一变化。但是我确定超时变量保持不变。值为:
interactive_timeout=300
connect_timeout=300
wait_timeout=10
还有什么可以创造差异?