Mysql服务器默认的“wait_timeout”是8小时,也就是说一个connection空闲超过8个小时,Mysql将自动断开该 connection。这就是问题的所在,在Hibernate默认连接池中的connections如果空闲超过8小时,Mysql将其断开,而Hibernate默认连接池并不知道该connection已经失效,如果这时有 Client请求connection,Hibernate默认连接池将该失效的Connection提供给Client,将会造成上面的异常。

root@mysqldb 10:42:  [(none)]> show variables like '%timeout%';
+-----------------------------+----------+
| Variable_name               | Value    |
+-----------------------------+----------+
| connect_timeout             | 10       |
| delayed_insert_timeout      | 300      |
| have_statement_timeout      | YES      |
| innodb_flush_log_at_timeout | 1        |
| innodb_lock_wait_timeout    | 10       |
| innodb_rollback_on_timeout  | ON       |
| interactive_timeout         | 600      |
| lock_wait_timeout           | 3600     |
| net_read_timeout            | 30       |
| net_write_timeout           | 60       |
| rpl_stop_slave_timeout      | 31536000 |
| slave_net_timeout           | 60       |
| wait_timeout                | 600      |
+-----------------------------+----------+
13 rows in set (0.00 sec)

wait_timeout和interactive_timeout默认值是28800也就是8小时,最大值只允许2147483(24天左右)
高并发请求下wait_timeout参数不宜设置太大,会造成堵塞;
解决办法:

user.datasource.url=jdbc:mysql://clcdbm1:3307/bazhong_user?serverTimezone=UTC&useUnicode=true&autoReconnect=true&failOverReadOnly=false&preferredTestQuery=select now()

既增加autoReconnect和failOverReadOnly、preferredTestQuery三个参数
Mysql JDBC URL连接常见参数表:

参数名称     参数说明     缺省值     最低版本要求
user     数据库用户名(用于连接数据库)           所有版本
password     用户密码(用于连接数据库)           所有版本
useUnicode     是否使用Unicode字符集,如果参数characterEncoding设置为gb2312或gbk,本参数值必须设置为true     false     1.1g
characterEncoding     当useUnicode设置为true时,指定字符编码。比如可设置为gb2312或gbk     false     1.1g
autoReconnect     当数据库连接异常中断时,是否自动重新连接?     false     1.1
autoReconnectForPools     是否使用针对数据库连接池的重连策略     false     3.1.3
failOverReadOnly     自动重连成功后,连接是否设置为只读?     true     3.0.12
maxReconnects     autoReconnect设置为true时,重试连接的次数     3     1.1
initialTimeout     autoReconnect设置为true时,两次重连之间的时间间隔,单位:秒     2     1.1
connectTimeout     和数据库服务器建立socket连接时的超时,单位:毫秒。 0表示永不超时,适用于JDK 1.4及更高版本     0     3.0.1
socketTimeout     socket操作(读写)超时,单位:毫秒。 0表示永不超时
preferredTestQuery  用于检测数据库连接测试,检测数据库是否能连接成功,后面可以直接跟sql语句
带符号 * 的表示必填项