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