最近做的一个服务端项目,用DBCP创建数据库连接池,连接MySQL。服务器挂了几天,客户端请求时偶尔会发现java.sql.SQLException: Already closed异常。检查并没有发现业务逻辑错误。仔细查找资料得知:当一个连接长时间没有数据请求时,MySQL会根据超时时间关闭这个连接。而DBCP并不知道连接已经关闭了,再通过这个连接请求数据库就会抛出这个异常。
解决方法:给DBCP设置一个验证查询,在每次取出连接时验证连接的有效性。如果验证失败,则从池中去除这个连接,并尝试取出另一个。
看上去很麻烦,其实DBCP提供了很简单的方法:
//SQL查询,用来验证从连接池取出的连接,在将连接返回给调用者之前.
//如果指定,则查询必须是一个SQL SELECT并且 必须返回至少一行记录
ds.setValidationQuery("select 1");
//指明是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个
ds.setTestOnBorrow(true);
评论列表: