在Java中处理SQL连接池清理和错误处理的正确方法是什么?

时间:2013-04-10 00:27:10

标签: java mysql jdbc innodb

我一直在学习使用Oracle JDBC在Java中使用MySQL,我正试图进入try / catch和pool cleanup的思维模式。

我想知道以下代码是否是正确清理所有内容的正确方法,或者如果您发现我的代码中存在需要我错过的内容的漏洞。为了记录,我打算使用InnoDB及其行锁定机制,这就是我关闭自动提交的原因。

try
{
    connection = getConnection(); // obtains Connection from a pool

    connection.setAutoCommit(false);

    // do mysql stuff here
}
catch(SQLException e)
{
    if(connection != null)
    {
        try
        {
            connection.rollback(); // undo any changes
        }
        catch (SQLException e1)
        {
            this.trace(ExtensionLogLevel.ERROR, e1.getMessage());
        }
    }
}
finally
{
    if(connection != null)
    {
        try
        {
            if(!connection.isClosed())
            {
                connection.close(); // free up Connection so others using the connection pool can make use of this object
            }
        }
        catch (SQLException e)
        {
            this.trace(ExtensionLogLevel.ERROR, e.getMessage());
        }
    }
}

getConnection()从池中返回一个Connection对象,connection.close()关闭它,将其释放回池中(所以我已经被告知,对我来说还是新的,所以如果我这么道歉我在说垃圾)。任何这方面的任何帮助将不胜感激!

谢谢!

1 个答案:

答案 0 :(得分:1)

我建议不要在finally块中将autocommit设置为true - 依赖于autocommit的其他线程设置为true不应该假设池中的连接处于此状态,而是应该将autocommit设置为true在使用连接之前(正如此线程将autocommit设置为false)。

此外,您应该在调用close()之前检查连接的isClosed属性。

除此之外,我没有看到任何问题。