可能需要设置一:
使用Connector/J连接MySQL数据库,程序运行较长时间后就会报以下错误:
Communications link failure,The last packet successfully received from the server was *** millisecond ago.The last packet successfully sent to the server was *** millisecond ago。
其中错误还会提示你修改wait_timeout或是使用Connector/J的autoReconnect属性避免该错误。
后来查了一些资料,才发现遇到这个问题的人还真不少,大部分都是使用连接池方式时才会出现这个问题,短连接应该很难出现这个问题。这个问题的原因:
MySQL服务器默认的“wait_timeout”是28800秒即8小时,意味着如果一个连接的空闲时间超过8个小时,MySQL将自动断开该连接,而连接池却认为该连接还是有效的(因为并未校验连接的有效性),当应用申请使用该连接时,就会导致上面的报错。
修改MySQL的参数,wait_timeout最大为31536000即1年,在my.cnf中加入:
[mysqld]
wait_timeout=31536000
interactive_timeout=31536000
重启生效,需要同时修改这两个参数。
可能需要设置二:
<dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://47.96.128.xxx:8066/TESTDB?useUnicode=true&characterEncoding=utf-8" /><!-- & 换成 & 后 mybatis会报错--> <property name="username" value="root" /> <property name="password" value="wuhan85123_" /> <property name="poolMaximumActiveConnections" value="100" /> <property name="poolMaximumIdleConnections" value="30" /> <property name="poolPingEnabled" value="true"/> <property name="poolPingQuery" value="select 1"/> <property name="poolPingConnectionsNotUsedFor" value="1800000"/> </dataSource>
poolPingEnabled – 发送到数据库的侦测查询,用来检验连接是否处在正常工作秩序中并准备接受请求。默认是“NO PING QUERY SET”,这会导致多数数据库驱动失败时带有一个恰当的错误消息。
poolPingQuery – 对数据库进行ping时所使用的sql,最好是一个非常快的 SQL。
poolPingConnectionsNotUsedFor – 默认值是0,单位是毫秒。我们不能在每次使用连接池之前,都使用ping机制,这会使每一条sql的执行,都要额外执行一次ping语句。所以使用此属性来避免这种不合理做法。我们只针对闲置时间超过某个时间的连接,进行ping。本例中的值为半小时,当从连接池中拿出的连接闲置超过半小时,才会对它进行ping。