Пул подключений - PullRequest
       13

Пул подключений

0 голосов
/ 11 августа 2011
 BlockingQueue<Connection> connections = new LinkedBlockingQueue<Connection>(maxConnection);

AtomicInteger numberOfDrewedConnectionFromPool

В моем ConnectionPool я использую LinkedBlockingQueue.У меня есть некоторые сомнения, будет ли умножение «if Statement» поточно-ориентированным.maxConnection является константой.numberOfDrewedConnectionFromPool изменяется также в методе releaseConection без lock () ..

 public Connection getConnection() throws ConnectionPoolException {
    Connection connection = null;

    if ((connections.poll() == null) && (maxConnection > numberOfDrewedConnectionFromPool.get())) {
        return newConnection();
    } else {
        return connections.poll();
    }
}


private Connection newConnection() throws ConnectionPoolException {
    lock.lock();
    Connection connection = null;
    try {
        try {
            connection = DriverManager.getConnection(url, user, password);
            numberOfDrewedConnectionFromPool.incrementAndGet();
        } catch (SQLException exception) {
            throw new ConnectionPoolException();
        }
    } finally {
        lock.unlock();
        return connection;
    }

}

1 Ответ

1 голос
/ 11 августа 2011

Нет, ваш код не является потокобезопасным.

Между временем, когда вызывается connections.poll(), и временем, когда количество соединений сравнивается с максимальным, какой-то другой поток мог освободить или принять соединение, а число соединений могло измениться. Более того, вы дважды опрашиваете очередь, чтобы получить одно соединение.

Примечание: почему вы изобретаете велосипед? Есть много свободных подключений.

...