2013-04-10 3 views
1

Посмотрите на следующий код. 1. Я создаю пул подключения к stardog
2. Получение подключения из пула. 3. Возврат соединения к пулу после использования.Что произойдет, если я закрою соединение из пула подключений stardog

Мой вопрос заключается в том, что произойдет, если я сделаю 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(); 

, что happends если я закрываю соединение, aConn.close();

Основная причина, почему я спрашиваю, когда я использую соединение в любых классах я не имею объект пула сделать aPool.release(aConn);

ли это рекомендуется делать . Будет ли это испортить использование пула.

ответ

2

Если вы закрываете соединение напрямую, у пула по-прежнему будет ссылка на соединение, поскольку он не был выпущен, поэтому, когда соединение закроет его ресурсы, пул сохранит ссылку, и вы, вероятно, будете пропускать память со временем.

Предложенный способ справиться с этим, когда вы получаете соединение из пула, заверните его с помощью 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()); 
    } 
} 

Таким образом, вы можете просто закрыть соединение в коде, который использует его, и он будет правильно отпустите обратно в пул, и вам не нужно беспокоиться о прохождении ссылки на пул.

+0

спасибо, Это дает четкую идею. –

+0

Примите ответ, чтобы другие знали, что это правильная информация. – Michael

+0

Пул, поддерживающий закрытое соединение, создаст любые другие проблемы? например, если запрос другого класса для подключения и пула обеспечивает закрытое соединение, и это закончится закрытым исключением. –