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