如果我关闭stardog连接池的连接会发生什么?



看一下下面的代码。1. 我正在创建一个连接池到stardog
2. 从池中获取连接。3.使用后返回连接到池。

我的问题是如果我做aConn.close()而不是返回池会发生什么。

 ConnectionConfiguration aConnConfig = ConnectionConfiguration
.to("testConnectionPool")
.credentials("admin", "admin");
ConnectionPoolConfig aConfig = ConnectionPoolConfig
   .using(aConnConfig)
   .minPool(10)
   .maxPool(1000)
   .expiration(1, TimeUnit.HOURS)   
   .blockAtCapacity(1, TimeUnit.MINUTES);
// now i can create my actual connection pool
ConnectionPool aPool = aConfig.create();
// if I want a connection object...
Connection aConn = aPool.obtain();
// now I can feel free to use the connection object as usual...
// and when I'm done with it, instead of closing the connection, 
//I want to return it to the pool instead.
aPool.release(aConn);
// and when I'm done with the pool, shut it down!
aPool.shutdown();

如果我通过aConn.close();关闭连接会发生什么

我问的主要原因是,每当我在任何类中使用连接时,我没有池对象来做aPool.release(aConn);

建议这样做吗?这会影响池的使用吗?

如果您直接关闭连接,池中仍然会有对connection的引用,因为它还没有被释放,所以当connection关闭其资源时,池将保留引用,并且随着时间的推移,您可能会泄漏内存。

处理这个问题的建议方法是,当您从池中获得连接时,使用DelegatingConnection封装它:

public final class PooledConnection extends DelegatingConnection {
    private final ConnectionPool mPool;
    public PooledConnection(final Connection theConnection, final ConnectionPool thePool) {
        super(theConnection);
        mPool = thePool;
    }
    @Override
    public void close() {
        super.close();
        mPool.release(getConnection());
    }
}

通过这种方式,您可以简单地关闭使用它的代码中的Connection,它将正确地释放回池中,您不必担心将引用传递到池中。

相关内容

  • 没有找到相关文章

最新更新