noHup - mysql
type: channel
link: http://www.nohup.cc/tag/mysql/
items: 配置Hibernate解决MYSQL连接失效问题

配置Hibernate解决MYSQL连接失效问题
type: item
date: 2016-01-04T07:48:00+00:00
description: Overview1. 错误描述2. 分析3. 解决方法3.1 使用c3p0数据库连接池4. 堆栈错误补充5. 参考资料 Overview 之前将SecretEPDB部署到了云服务器上之后，再打开需要连接数据库的网页时总是会出现莫名其妙的错误，之前一直没管它，主要是因为这个错误不是每次都出现，出现之后刷新几次又可以访问了。 1. 错误描述 每次打开需要连接数据库的网页，就很有很大概率出现下面的错误信息： Struts Problem Report Struts has detected an unhandled exception: Messages: Broken pipe The last packet successfully received from the server was 144,004,781 milliseconds ago. The last packet sent successfully to the server was 144,004,781 milliseconds ago. is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem. No operations allowed after connection closed. could not execute query 第一反应是Struts的问题，但很快就可以排除，因为： 在本地开发时，不会有这个问题，只有部署到服务器上了才会出现。 错误信息很明确，这个服务器链接失效了。 2. 分析 查了一些资料，定位了这个错误，是因为MYSQL的链接失效问题，在 MySQL相关问题 中，我们配置了wait_timeout=31536000这句话，所以MYSQL在31536000毫秒之后会失效，尽管我们已经将wait_timeout的值改得很大了(默认是8小时)，但是即使再大，也会有失效的时候，这时候服务器会得到一个失效的数据库连接，但是Hibernate并不知道它失效了，继续交给Struts使用，就会报上面的错误。 重启tomcat可以解决这个问题，因为所有的连接都重新初始化了嘛，但是时间久了肯定还会出问题，这也是为什么在本地开发时不会出问题，因为tomcat总在不停地重启，连接就没等到失效的时候。 3. 解决方法 查了一下原因，为了偷懒，选择了最简单的解决方法，在hibernate配置文件hibernate.cfg.xml中添加下面的配置： true true true 第二天发现又有问题了，看来这样不是很可行。 3.1 使用c3p0数据库连接池 其实也不是很麻烦，Hibernate默认就支持c3p0，先去你使用的Hibernate版本的文件包的lib文件夹中，找到c3p0-***.jar，版本号与当前的Hibernate有关。从Hibernate包中去找是一个最佳实践，可以让你避免一些不兼容性问题。我们使用的是Hibernate 3，所以我去下了一个Hibernate3的包，官网上已经不再提供Hibernate 4以下的包了，可以去 sourceforge上下载这个版本。 下载时候，将lib文件夹里面的c3p0-***.jar加入项目的引用，并在hibernate.cfg.xml中添加下面的配置（其实默认hibernate.cfg.xml中有这部分代码，只是是注释掉的，取消注释就可以）： org.hibernate.connection.C3P0ConnectionProvider 5 30 1800 50 1 120 true 重新发布项目，在服务器上部署以后，不仅解决了链接失效问题，数据库访问速度快了很多。因为c3p0维护了数据库连接池，并在使用时验证链接是否可用（ true ），如果失效了，则重新打开。 4. 堆栈错误补充 还有一种情况可以导致MySQL链接失效，错误信息如下: … Stacktraces org.hibernate.exception.JDBCConnectionException: could not execute query … com.mysql.jdbc.…