@ScRsa
Delphi/Oracle Изучаю JAVA

Можно ли использовать try с ресурсами для закрытия connection из пула?

В java я достаточно недавно. Возникло недопонимание в плане правильности высвобождения connection взятого из пула. Я использую try с ресурсами, но более опытные коллеги говорят, что так закрывать нельзя, поскольку это приведет к тому, что все connection из пула будут израсходованы.

Пример кода:
public void saveUser(User user) {
        try (
                Connection connection = connectionPool.getConnection();
                PreparedStatement preparedStatement = connection.prepareStatement(
                        "INSERT INTO users (id, login, pass) VALUES (nextval('sqn_user'),?,?)")) {
            preparedStatement.setString(1, user.getUserLogin());
            preparedStatement.setString(2, user.getUserPass());
            preparedStatement.execute();
            connection.commit();
        } catch (SQLException e) {
            log.error(e);
        }
    }

Можно ли в данном примере использовать try с ресурсами, или нужно закрывать по старинке?

В качестве connectionpool используется Hikari
HikariDataSource dataSource;
    HikariConfig config = new HikariConfig();
    config.setDriverClassName("org.postgresql.Driver");
    config.set...url,username,password;
    config.setAutoCommit(false);
    config.setMaximumPoolSize(50);
    dataSource = new HikariDataSource(config);
    dataSource.setInitializationFailFast(true);
  • Вопрос задан
  • 521 просмотр
Решения вопроса 2
EugeneP2
@EugeneP2
Java Dev
Да, можно. Все что наследует интерфейс AutoCloseable можно использовать в try-with-resources

Нужно смотреть что это за "connectionPool"... Если это реализация DatSource, например получаемая из томката, или org.apache.commons.dbcp.BasicDataSource... То вызов метода close возвратит коннекшен обратно в пул. А если человек как то напрямую работает с пулом, то тут нужно бить по рукам
Ответ написан
Комментировать
@va1eb
В данном случае connection берётся из пула, поэтому вместо его закрытия логично его возвращать обратно в пул. Если его не возвращать в пул в пуле не останется коннекшэнов, и в зависимости от реализации пула могут возникнуть разные проблемы. Если закрывать конекшен перед возвращением его в пул то в пуле со временем будут только закрытые конекшены, что опять же приведёт к различным проблемам.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы