曾经在公司的时候,同事做项目(tomcat + struts+ mysql)时遇到了这样一个问题。
第一次登录的时候,系统正常运行,机器没有关闭,第二天再次登陆的时候,
系统就出现了问题。后来查出来是数据库连接池的连接断开的缘故。重起tomcat 又恢复正常了。
原因是Mysql的把长时间没有活跃的连接给断开了。默认的时间是28800s ,折8小时。
也不知道当时他有没有仔细上网搜索,反正,他问我,我也因为时间忙没有仔细探究。
后来他就索性放弃数据库连接池,直接用JDBC代替了。
这几天,自己做的项目又遇到了这个问题,不得不设法解决这个问题。
终于有了解决办法,而且仍然可以使用数据库连接池。
核心思想就是改变数据库连接池的实现方式。
原先用的是struts自带的数据库连接池(struts-legacy.jar),改用apache的dbcp连接池。
步骤如下:
1,修改数据库连接池,使用apache的 DBCP代替
从apache官方网站新增两个包 commons-pool-1.3.jar 和 commons-dbcp-1.2.2.jar
放到相应的lib下面。如果已经有了,不需下载。
2,修改Struts-config.xml配置。
修改如下:
<data-sources>
<data-source key="org.apache.struts.action.DATA_SOURCE" type="org.apache.commons.dbcp.BasicDataSource">
<set-property property="driverClassName" value="com.mysql.jdbc.Driver" />
<set-property property="description" value="wjjg" />
<set-property property="url" value="jdbc:mysql://localhost/wjjg?useUnicode=true&characterEncoding=GB2312" />
<set-property property="password" value="12345678" />
<set-property property="username" value="wjjg" />
<set-property property="maxActive" value="10" />
<set-property property="maxIdle" value="60000" />
<set-property property="maxWait" value="60000" />
<set-property property="defaultAutoCommit" value="true" />
<set-property property="defaultReadOnly" value="false" />
<set-property property="testOnBorrow" value="true"/>
<set-property property="validationQuery" value="select 1"/>
</data-source>
其中testOnBorrow 和 validationQuery 很重要。
testOnBorrow的意思是从数据库连接池中取得连接时,对其的有效性进行检查。
validationQuery 是用来检查的SQL语句,“select 1”执行较快,是一个不错的检测语句。
参考: