Apache dbcp пул соединений не работает должным образом - PullRequest
1 голос
/ 02 июня 2019

Я пытаюсь подключиться к базе данных mysql, используя apache dbcp2 пул соединений, следуя инструкциям, приведенным здесь:

https://git -wip-us.apache.org / репо / АФС р = Обще-dbcp.git; а = блоб; F = DOC / PoolingDataSourceExample.java; ч = 2a12c74898930b9623223db1597b8a8052a6f1df; ПП = ГОЛОВКА

Класс соединения с моей базой данных, который возвращает соединение, выглядит примерно так:

public class DbConnection {

private static interface Singleton {

    final DbConnection INSTANCE = new DbConnection();
}

private final PoolingDataSource<PoolableConnection> dataSource;

private DbConnection() {
    // A ConnectionFactory that the pool will use to create Connections.
    DriverManagerConnectionFactory connectionFactory = new DriverManagerConnectionFactory(url, user, pass);  //url,user,pass for db connnection

    //implement the pooling functionality.
    PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(connectionFactory, null);
    GenericObjectPoolConfig config = new GenericObjectPoolConfig();
    config.setMaxWaitMillis(500);
    config.setMaxTotal(20);
    config.setMaxIdle(5);
    config.setMinIdle(5);
    //PoolingDataSource expect an ObjectPool
    ObjectPool<PoolableConnection> connectionPool = new GenericObjectPool<>(poolableConnectionFactory, config);
    // Set the poolableConnectionFactory's pool property to the owning pool
    poolableConnectionFactory.setPool(connectionPool);

    this.dataSource = new PoolingDataSource<>(connectionPool);
}

public static Connection getCon() throws SQLException {
    return Singleton.INSTANCE.dataSource.getConnection();
}
} 

Я использую apache jmeter для проверки соединения и возврата чего-либо из моей базы данных mysql. Я создал 100 пользователей с периодами разгона (в секундах), равными 2 секундам. Я создал Http request, и когда я попытался увидеть свой ответ в view results tree, я успешно получил ответ на первые 20 запросов. Более поздние запросы от (21 до 100) имеют пустой ответ. Я прошел через многие из проблем, связанных с:

java.sql.SQLException: не удается получить соединение, ошибка пула Timeout ожидание незанятого объекта

Я получаю доступ к своему коду как:

try (PreparedStatement ps = DbConnection.getCon().prepareStatement("SELECT id FROM test WHERE id =?;")) {
        ps.setString(1, id);
        try (
                ResultSet rs = ps.executeQuery()) {
            return rs.next();
        }
    } catch (Exception ex) {

    }

1 Ответ

1 голос
/ 02 июня 2019

Вы не закрываете Connection объект, вы должны объявить такую ​​переменную в блоке try-with-resources:

try (Connection conn = DbConnection.getCon(); 
       PreparedStatement ps = conn.prepareStatement("SELECT id FROM test WHERE id =?;")) {

Также вам нужно закрыть ResultSet, либо вызвать close метод ResultSet в методе, либо добавить его в блок try-with-resources, используя новый метод, возвращающий его

...