首页
JAVA笔记
数据库笔记
混乱记忆
小站记
您现在的位置
ssh项目 mysql数据库连接异常
简介: ssh项目,com.mysql.jdbc.exceptions.jdbc4.CommunicationsException异常,org.springframework.transaction.CannotCreateTransactionException异常。

一个mysql做的项目,在上线之隔天可能会出现 com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:
    The last packet successfully received from the server was xxx milliseconds ago.
    The last packet sent successfully to the server was xxx   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.

 

或者是:

org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is org.hibernate.TransactionException: JDBC begin failed:

 

 

这样的异常,这个异常在使用连接池的环境中最为常见。

上面的简介以及说明原因和解决办法,为了更好的理解,我们根据它的内容做一下验证。

连接上数据库之后执行命令

mysql> show global variables like 'wait_timeout%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout  | 28800 |
+---------------+-------+
1 row in set (0.00 sec)

 

得到把得到的28800除以3600值为8,也就是别人常说的mysql8小时超时问题,如果一个连接在连接上之后8个小时内没有进行任何操作,那么mysql会将这个连接抛弃,但是有时我们没有做相应的处理那么就会出现CommunicationsException异常,根据上面的英文内容,我们得到的解决方案是添加autoReconnect并且设置值为true,但是单单只添加autoReconnect在使用连接池时并没有效果。

 

根据这个方案我们进行如下配置:

注:红色字体是需要注意的内容

<Resource name="jdbc/pageFrame"
  auth="Container"
  type="javax.sql.DataSource"
  driverClassName="com.mysql.jdbc.Driver"
  url="jdbc:mysql://127.0.0.1:3306/databaseName?autoReconnect=true"
  username="uname"
  password="upass"
  maxActive="20" maxIdle="10" maxWait="10000"
  validationQuery = "SELECT 1" 
     timeBetweenEvictionRunsMillis = "300000" 
     minEvictableIdleTimeMillis = "1800000"
     testWhileIdle = "true"

  />

 

 更多jndi数据源参数查看请单击连接:http://www.xiaoyunduo.org/article/66/