周末的时候Java程序的连接池突然出问题,报错如下所示。
java.sql.SQLRecoverableException: No more data to read from socket
此问题不是特定的页面存在,而是所有连接数据库查询的功能均报错
先确定一下排查的思路吧,
1.周五的时候确实我们有新的功能上线,所以首先排查是否是新功能影响了连接的释放,结果确定不是。
2.是否是因为工具类或者公用方法被修改导致数据库连接问题,结果确定没有修改。
经过网上查找资料和其他渠道,得知此问题通常是连接失效或者超时造成的。
那我们知道连接池这个东西,通常是程序初始化的时候就创建了很多连接,之后如果这些连接不够用,可能会有更多连接被创建使用,用完了可能会释放,这些都是看配置的;归根结底有一部分是初始就存在的,作为核心连接,它们失效或者超时的可能性更大。
然后跟数据库开发同事了解到,如果程序和数据库都正常运行,那连接是不会超时或者失效的,程序出现重大问题重启后也能重新获取数据库连接,除非数据库重启或者经历过dump,原有的连接它就不认识了,会造成连接失效,这时程序需要重新初始化,获取新的连接。
最后问了一下DBA,周末在做个什么测试,数据库重启过。。。。所以重启下应用程序就可以了。