JDBC连接池设计

丹尼尔·斯普

我已经使用诸如getConnection和returnConnection之类的同步方法开发了JDBC连接池。这很好用,并且对于我的目的来说足够快了。现在,当必须在我们应用程序的其他程序包中共享此连接池时,就会发生问题,因此其他开发人员也将使用它。我感到有些困惑,因为他们总是需要执行returnConnection,而且恐怕他们可能会忘记这样做。

考虑一下,我想到了只在我的连接池中公开方法,并迫使其他开发人员封装其代码的想法,因此我在连接池中处理了getConnection / returnConnection。

会是这样的:

public MyConnectionPool {

private Connection getConnection() {
    //return connection
}

private void returnConnection(Connection connection) {
     //add connection to list
}

public void executeDBTask(DBTaskIF task) {
    Connection connection = getConnection();
    task.execute(connection);
    returnConnection(connection);
}

}

在哪里:

public interface DBTaskIF {
  public execute(Connection connection);
}

带有以下DBTaskIF的示例:

connectionPool.executeDBTask( new DBTaskIF() {
public void execute(Connection connection) {

PreparedStatement preStmt = null;
try {
    preStmt = connection.prepareStatement(Queries.A_QUERY);
    preStmt.setString(1, baseName);
    preStmt.executeUpdate();
} finally {
    if(preStmt!=null) {
    try {
        preStmt.close();
    } catch (SQLException e) {
        log.error(e.getStackTrace());
    }
}
}}});

希望您能明白。我想知道的是您对这种方法的看法。我想向开发团队提出这个建议,但我担心有人会说这不是标准或OOP或其他东西。

VH-NZZ

我感到有些困惑,因为他们总是需要执行returnConnection,而且恐怕他们可能会忘记这样做。

考虑一下,我想到了只在连接池中公开方法,并迫使其他开发人员封装其代码的想法,因此我在连接池中处理了getConnection returnConnection。

我对此声明感到担忧。API不应(永远不会?)假定使用它们的人会以某种方式执行此操作,而无论使用哪种方法,API都不会通过合同强制实施这些方法。

并且java.sql.Connection是一个广泛使用的界面,因此您可以通过告诉人们如何在游泳池中使用它来使自己成为敌人。

相反,您应该假设Connection实例将被正确使用,finally一旦实例使用结束(例如,参见与数据源对象连接),它们将被关闭(块中的connection.close()):

   Connection con;
   PreparedStatement stmt;
   try {
        con = pool.getConnection();
        con.setAutoCommit(false);
        stmt = con.prepareStatement(...);
        stmt.setFloat(1, ...);
        stmt.setString(2, ...);
        stmt.executeUpdate();

        con.commit();
        stmt.close();
    } catch (SQLException e) {
        con.rollback();
    } finally {
        try {
           if(con!=null) 
               con.close();
           if(stmt!=null) {
               stmt.close();
        } catch (SQLException e) {
             ...
        } finally {

        }
    }

Connection关闭时,池实现应被回收。

我第二个@lreeder的评论是,您实际上是在重新发明轮子,并且大多数可用的连接池对于大多数用途而言绝对足够快,并且随着时间的推移进行了许多细微的调整。这也适用于嵌入式数据库。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章