MySQL超时?无法说出发生了什么,Java

时间:2014-06-06 21:31:55

标签: java mysql sql apache-commons-dbcp

我正在运行此方法来使用DBCP连接池更新SQL:

完全8次后,方法setValue停止这样做,并且不会发送任何数据。

    public static void setValue(String user, Integer id){
    Connection connection = null;
    try {
        try {
            connection = DataSource.getInstance().getConnection();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (PropertyVetoException e) {
            e.printStackTrace();
        }
        ttl++;
        PreparedStatement ps = connection.prepareStatement("REPLACE INTO " + "accounts"+ " (user,id) VALUES(?,?)");
        ps.setString(1, user);
        ps.setInt(2, id);
        ps.executeUpdate();
                    ps.close();
    } catch (SQLException ex) {
        ex.printStackTrace();
    }
    return;
}

我不熟悉MySQL或连接池,我不知道这里出了什么问题。请帮我解决此问题或提供任何建议?非常感谢你!

3 个答案:

答案 0 :(得分:2)

我的猜测是你只是在使用池中的所有连接

尝试输入finally块

finally {
connection.close();
}

即使您使用的是连接池,您仍然必须关闭连接 - 它只是连接池实际上没有关闭它,它只是将它返回到池中,所以其他人可以使用它它

答案 1 :(得分:2)

是的,您应该关闭连接,这只会将其返回到池中。基本上你应该在方法的finally {}块中添加它。希望这会有所帮助。

public static void setValue(String user, Integer id){
    Connection connection = null;
    try {
        try {
            connection = DataSource.getInstance().getConnection();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (PropertyVetoException e) {
            e.printStackTrace();
        }
        ttl++;
        PreparedStatement ps = connection.prepareStatement("REPLACE INTO " + "accounts"+ " (user,id) VALUES(?,?)");
        ps.setString(1, user);
        ps.setInt(2, id);
        ps.executeUpdate();
                    ps.close();
    } catch (SQLException ex) {
        ex.printStackTrace();
    } finally {
        if (connection != null) connection.close();
    }    
    return;
}

答案 2 :(得分:1)

使用try catch finally块,在try中提交连接,在finally中关闭准备好的语句,然后在异常回滚中。

 public static void setValue(String user, Integer id){
    Connection connection = null;
    try {
        try {
            connection = DataSource.getInstance().getConnection();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (PropertyVetoException e) {
            e.printStackTrace();
        }
        ttl++;
        PreparedStatement ps = connection.prepareStatement("REPLACE INTO " + "accounts"+ " (user,id) VALUES(?,?)");
        ps.setString(1, user);
        ps.setInt(2, id);
        ps.executeUpdate();
        connection.commit();           
    } catch (SQLException ex) {
        connection.rollback();
        ex.printStackTrace();
    }
    finally {
        ps.close();
    }
    return;
}