在使用HikariCp数据库连接池时每隔一段时间会出现数据库无法访问的问题

报错如下

2019-08-21 12:44:53
[WARN]: HikariPool-1 - Failed to validate connection com.mysql.jdbc.JDBC4Connection@83b51b8 (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value.

2019-08-21 12:44:58
[WARN]: HikariPool-1 - Failed to validate connection com.mysql.jdbc.JDBC4Connection@4933c203 (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value.

2019-08-21 12:45:03
[WARN]: HikariPool-1 - Failed to validate connection com.mysql.jdbc.JDBC4Connection@679ffe26 (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value.

已经根据提示在网上找了相关的设置,但仍没有效果

HikariCpPlugin hp = getHikariCpPlugin();
/**
 * 一个连接的生命时长(毫秒),超时而且没被使用则被释放(retired),缺省:30分钟。
 * 强烈建议设置比数据库超时时长少30秒,(MySQL的wait_timeout参数(单位s),show variables like ‘%timeout%’,一般为8小时)
 * 计算公式: (wait_timeout-30)*1000
 */
hp.setMaxLifetime(28700000L);
me.add(hp);

ActiveRecordPlugin arp = new ActiveRecordPlugin(hp);
arp.getEngine().setDevMode(prop.getBoolean("devMode", false));
arp.setShowSql(prop.getBoolean("devMode", false));
arp.setTransactionLevel(Connection.TRANSACTION_READ_COMMITTED);
arp.addSqlTemplate("/sql/_all.sql");
me.add(arp);

查询了数据库的wait_timeout值为28800,按照网上修改建议设置了仍没有效果,谁知道这个如何解决吗?

评论区

JFinal

2019-08-21 16:38

这个问题并不是异常,而仅仅是个警告,并且提示信息告知要使用更短的 maxLifetime 值

而你设置的值太大了

这个可能还不是关键问题,或许是你自己有代码提前关闭了 Connection

搜索一下你的代码有没有这种 getConnection(), 如果是自行获取连接,建议: getDataSource().getConnection() , 这样更安全,因为前者你获取到的可能是一个 ThreadLocal 中的连接,如果你开启了事务,线程后续还需要使用该 ThreadLocal 就会有问题

不过这个可能性很小,因为这种情况大概率会报异常而不是警告

Dull

2019-08-22 14:29

嗯嗯,目前把maxLifetime设置为1200000L,没有出现这种情况了,项目代码中没有使用getConnection()方法,应该是maxLifetime的问题