2013-05-06 70 views
2

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

目前我重构了一些代码,并开发一个抽象类,会管理的连接(从得到他们,并把它们放回数据源),并留下声明细节落实到子类。

为了避免与不关闭的语句未来的错误,我想过returing的连接错误入池前执行一些检查,如果我发现一些开语句要么关闭他们或记录警告。

生成的类是这样的:

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. 你会推荐这种方法吗?

非常感谢,

普约尔

+0

我有完全做到了这一点,在过去,但它需要创建跟踪创建的每个语句“代理” JDBC Connection对象,并会关闭它们的连接被“退回”。这是'上个世纪',所以事情可能已经改变,并且,如果我记得,我使用了一个java.lanf.reflect.Proxy – rolfl 2013-05-06 11:08:26

回答

1

Connection.close API说

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.

+0

感谢您的回应。但是,这不适用于我使用OracleDataSource实现的情况。 其实,看着甲骨文[文件](http://docs.oracle.com/cd/B13789_01/java.101/b10979/basic.htm#i1006632)上面清清楚楚地写着: '你必须明确地关闭ResultSet和Statement对象完成使用后...如果没有明确关闭ResultSet和Statement对象,则可能发生严重的内存泄漏 – 2013-05-06 14:27:12