一个都起灰尘的项目,最近出现一个问题。描述如下:当天使用很正常,到了第二天就不能登录使用,具体的说不能访问数据库。重启“小猫”之后,能正常使用,但到第二天又不行啦。根据日志分析,是MySQL数据库连接关闭了。
“java.sql.SQLException
MESSAGE: Communication link failure: java.net.SocketException, underlying cause: Software caused connection abort: recv failed”.
上网查了些帖子,发现可能是MySQL5.0版本的一个bug:超时问题。MySQL默认等待时间间隔wait_timeout是8小时,也就是8小时内,我们的系统没有使用,没有对数据库进行访问的话,数据库会关闭连接,而当我们系统用这些连接对数据库进行访问时,就会出现上述问题。
解决办法有2种:
1. 对于MySQL5之前的版本,如Mysql4.x,只需要修改连接池配置中的URL,添加一个参数:autoReconnect=true,如果是MySQL5及以后的版本,则需要修改my.ini文件。在[mysqld]后面添加上: wait_timeout=1814400,把默认的8小时尽量延长。
2. 采用第三方的数据库连接池来管理连接, 如,proxool、C3P0等。性能方面据说proxool更强些。由于该系统用了hibernate,对C3P0支持比较好,C3P0.jar包无需另外下载。C3P0和hibernate的配置也相对简单,如下,
先把C3P0.jar包拷贝到WEB-INF\lib下,然后修改hibernate.cfg.xml文件,加入以下内容:
<!--C3P0 setting-->
<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<property name="hibernate.c3p0.min_size">2</property>
<property name="hibernate.c3p0.timeout">5000</property>
<property name="hibernate.c3p0.max_statements">100</property>
<property name="hibernate.c3p0.idle_test_period">3000</property>
<property name="hibernate.c3p0.acquire_increment">2</property>
<property name="hibernate.c3p0.validate">false</property>
这样基本可以解决MySQL的超时问题,如何检查该方法是否有效呢?可以通过修改服务器的系统日期,把日期往前推几个月,然后再访问系统,看是否还报错。
posted on 2009-06-22 14:56
matthew 阅读(921)
评论(0) 编辑 收藏 所属分类:
数据库(Sql server,My sql)