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

时间:2013-04-10 10:05:18

标签: java connection-pooling rdf pool 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);

是否建议这样做。 它是否会破坏汇集的使用。

1 个答案:

答案 0 :(得分:2)

如果直接关闭连接,则池仍将具有对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,它就会正确地释放回池中,您不必担心传递对池的引用。