22
2014
01

数据库连接池丢失连接异常

最近做的一个服务端项目,用DBCP创建数据库连接池,连接MySQL。服务器挂了几天,客户端请求时偶尔会发现java.sql.SQLException: Already closed异常。检查并没有发现业务逻辑错误。仔细查找资料得知:当一个连接长时间没有数据请求时,MySQL会根据超时时间关闭这个连接。而DBCP并不知道连接已经关闭了,再通过这个连接请求数据库就会抛出这个异常。

解决方法:给DBCP设置一个验证查询,在每次取出连接时验证连接的有效性。如果验证失败,则从池中去除这个连接,并尝试取出另一个。

看上去很麻烦,其实DBCP提供了很简单的方法:


        //SQL查询,用来验证从连接池取出的连接,在将连接返回给调用者之前.

        //如果指定,则查询必须是一个SQL SELECT并且 必须返回至少一行记录

        ds.setValidationQuery("select 1");

        //指明是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个

        ds.setTestOnBorrow(true);


« 上一篇下一篇 »

评论列表:

1.highkay  2014-3-6 11:11:58 回复该留言
推荐用阿里开源的druid,除了连接池管理上的优化,还有额外的profile能力
.LeeStorm  2014-3-7 15:52:26 回复该留言
感谢推荐,DBCP确实相对简陋了一点。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。