JAVA:当数据库重启后连接池没有自动识别的解决办法
今天发现服务器上的一个服务程序出现问题,软件抛出:Connection reset by peer: socket write error
无法正常提供服务,找了一下原因,原来是因为数据库服务器重启,连接池里的数据库连接 connection 无法创建新的 Statement,导致无法提供正常服务。
到百度搜索了一下,看到一篇文章与我遇到的问题类似,解决办法虽然看上去不是很好的办法,但也实用:
解决思路:在使用前创建一个 Statement,如果抛出异常,说明 connection 已断开,重新连接。
if (conn == null || conn.isClosed()) { conn=addConnetion()} else { Statement st= null; ResultSet rs=null; try { st= conn.createStatement(); //到这一步还不能确定 rs=st.executeQuery("select 0"); //到这一步才能确定 } catch (SQLException e) { conn=addConnetion();} finally { try {</span><span style="color: rgba(0, 0, 255, 1)">if</span>(rs!=<span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">) { rs.close(); rs</span>=<span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">; } </span><span style="color: rgba(0, 0, 255, 1)">if</span> (st != <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">) { st.close(); st</span>=<span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">; } } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (SQLException e) { e.printStackTrace(); } }
}
2008-11-26