我正在Tomcat6.0中使用GWT,Hibernate(基于XML的映射),MySQL-开发应用程序。 IDE- Netbeans 6.9 我在Netbeans中设置项目属性“Deploy On Save”选项。
当我的应用程序在服务器中长时间运行时,我的应用程序无法连接到数据库并引发以下异常
最终跟随堆栈跟踪是由于为调试目的而抛出的错误以及尝试终止线程而引起的 这导致了非法访问,并没有任何功能影响。
java.lang.IllegalStateException
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1273)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1233)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:316)
at com.mysql.jdbc.ConnectionImpl.realClose(ConnectionImpl.java:4273)
at com.mysql.jdbc.ConnectionImpl.close(ConnectionImpl.java:1444)
at org.hibernate.connection.DriverManagerConnectionProvider.close(DriverManagerConnectionProvider.java:152)
at org.hibernate.connection.DriverManagerConnectionProvider.finalize(DriverManagerConnectionProvider.java:142)
at java.lang.ref.Finalizer.invokeFinalizeMethod(Native Method)
at java.lang.ref.Finalizer.runFinalizer(Finalizer.java:83)
at java.lang.ref.Finalizer.access$100(Finalizer.java:14)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:160)
当我重新启动我的tomcat服务器时,我再次能够连接数据库。请告诉我如何获得无缝性能,并且可以在不重新启动tomcat的情况下完成工作。
答案 0 :(得分:5)
您可能正在打开越来越多的连接,并且从不关闭它们,最终达到数据库配置的最大连接数。
找到您打开连接的位置,并确保关闭它们。如果您为每个请求打开一个连接但不关闭它,那么很容易找到并修复。或者,当您收到错误时,可能没有关闭连接 - 请检查您的异常处理代码。
使用数据库连接时的推荐方法是使用try finally
尽最大努力关闭数据库连接:
Connection con;
try {
con = ...; // open connection
// do work
catch (SQLException e) {
// do whatever
} finally {
if (con != null && !con.isClosed()) {
try {
con.close();
catch (SQLException e) {
// Don't throw from here or you'll lose any return/exception from above
log.error("Failed to close connection", e);
}
}
}