我已经使用诸如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或其他东西。
我感到有些困惑,因为他们总是需要执行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] 删除。
我来说两句