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

Другие вопросы по тегам