MySQL第二天早上第一次连接超时报错,解决方法
最近新上的一个项目,第一天程序好好的。第二天早上来了项目就挂了,报出一个om.mysql.jdbc.exceptions.jdbc4.CommunicationsException异常。然后上网找原因,原来是mysql数据库连接超时,默认是28800秒,也就是8小时。通过sql show global variables like 'wait_timeout';查看。网上有两种方案解决问题一个就是设置数据库中默认的失效时间把这个8小时改长些,另一个方案在数据库地址中加入autoReconnect=true这个属性。于是我便使用了第二种mvn.jdbc.url=jdbc:mysql://localhost:3306/ceshi?autoReconnect=true;后来经测试还是不好使。
其实这个原理就是,长时间没有连接数据库就会失效,然后我就找到项目中用的的数据库连接池,BasicDataSource
BasicDataSource的池配置属性
池配置属性 |
指定的内容 |
initialSize | 池启动时创建的连接数量 |
maxActive | 同一时间可以从池分配的最多连接数量。设置为0时表示无限制。 |
maxIdle | 池里不会被释放的最多空闲连接数量。设置为0时表示无限制。 |
maxOpenPreparedStatements | 同一时间能够从语句池里分配的已备语句的最大数量。设置为0时表示无限制。 |
maxWait | 在抛出异常之前,池等待连接被回收的最长时间(当没有可用连接时)。设置为-1表示无限等待。 |
minEvictableIdleTimeMillis | 连接保持空闲而不被驱逐的最长时间。 |
minIdle | 在不新建连接的条件下,池中保持空闲的最少连接数。 |
poolPreparedStatements | 是否对已备语句进行池管理(布尔值)。 |
testWhileIdle=true #<!--他们两个配合,可以持续更新连接池中的连接对象,当timeBetweenEvictionRunsMillis 大于0时,--> #<!--每过timeBetweenEvictionRunsMillis 时间,就会启动一个线程,校验连接池中闲置时间超过minEvictableIdleTimeMillis的连接对象。--> timeBetweenEvictionRunsMillis=3
ok 问题解决了