2

我正在开发一个使用连接池并且有很多类使用它的连接的大型应用程序。最近我们遇到了一些问题,因为一些类在调用 connection.close() 方法之前没有关闭语句,错误地认为当连接关闭时,任何相关的语句也会关闭。

目前,我正在重构一些代码并开发一个抽象类,该类将管理连接(从数据源中获取它们并将它们放回数据源)并将语句细节留给子类实现。

为了避免将来与未关闭的语句相关的错误,我考虑在将连接返回到池中之前进行一些检查,如果我发现一些打开的语句要么关闭它们,要么记录一个警告。

生成的类将如下所示:

public abstract class AbstractDatabaseLoader {

    private DataSource dataSource;

    public final DatabaseValues load(DatabaseParams params) {

    DatabaseValues result = null;
    Connection connection = null;

    try {
        connection = dataSource.getConnection();
        result = load(connection, params);
    } catch (Exception ex) {
        // some logging;
    } finally {
        if (connection != null) {
            try {
                if (validateStatements(connection)){
                    logger.warn("The Connection is being returned into the POOL with opened Statments!");
                }
                connection.close();
            } catch (SQLException e) {
                // some logging.
            }
        }
    }
    return result;

    }

    protected abstract DatabaseValues load(Connection connection, DatabaseParams params);

    private boolean validateStatements(Connection connection){
        // Do Something here to validate if statements were properly closed.
    }

}

但是,我发现无法从连接接口恢复语句。

所以:

  1. 这甚至可能无需依赖特定的实现吗?
  2. 你会推荐这种方法吗?

非常感谢,

卡尔斯

4

1 回答 1

1

Connection.closeAPI 说

Releases this Connection object's database and JDBC resources immediately instead of waiting for them to be automatically released. 

如果它甚至是连接实际上没有关闭的连接池,则关闭由该连接创建的所有语句和结果集是连接池提供者的职责,这就是好的提供者在实践中所做的事情,请参阅 commons-dbcp http:/ /commons.apache.org/proper/commons-dbcp/apidocs/org/apache/commons/dbcp/DelegatingConnection.html#close()它说Closes the underlying connection, and close any Statements that were not explicitly closed.

于 2013-05-06T11:15:57.797 回答