随笔 - 251  文章 - 504  trackbacks - 0
<2009年6月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

本博客系个人收集材料及学习记录之用,各类“大侠”勿扰!

留言簿(14)

随笔分类

收藏夹

My Favorite Web Sites

名Bloger

非著名Bloger

搜索

  •  

积分与排名

  • 积分 - 199893
  • 排名 - 286

最新评论

         一个都起灰尘的项目,最近出现一个问题。描述如下:当天使用很正常,到了第二天就不能登录使用,具体的说不能访问数据库。重启“小猫”之后,能正常使用,但到第二天又不行啦。根据日志分析,是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)

只有注册用户登录后才能发表评论。


网站导航: