PostgreSQL не закрывает соединения

#java #postgresql #jdbc

#java #postgresql #jdbc

Вопрос:

Мы используем Liferay Portal 5.2.3 (с гибернацией и C3P0) на Tomcat 5.5.27, PostgreSQL 8.3. Обычно c3p0 объединяет соединения и возвращает его для повторного использования. Но иногда нам требуется много обновлений во времени, и PostgreSQL не освобождает соединение после закрытия (мы видим 100 незанятых соединений). Кроме того, эта проблема воспроизводится только в Linux (Debian 5.0). Соединения устанавливаются независимыми потоками, и в блоке finally метода run() мы всегда закрываем его. Я пробовал не использовать пул и написал простой DbConnection manager (getConnection() -> runQuery() -> CloseConnection ()), но PostgreSQL его не выпустил.

Комментарии:

1. вызывает ли проблему наличие этих незанятых соединений? Проверьте документацию c3p0 о том, как установить максимальное количество незанятых соединений.

2. Да, это БОЛЬШАЯ проблема — мы получили сообщение об ошибке «уже слишком много пользователей» (и мы не можем увеличить количество подключений до бесконечности). Я поиграл с настройками c3p0 — он вызывает connection.close(), но на стороне Postgre процесс все еще простаивает. Как я уже упоминал, я также пытался использовать его без c3p0.

3. Пожалуйста, ответьте на этот вопрос, если вы нашли решение, это звучит как интересная проблема.

4. » PostgreSQL не освобождает соединение «. Это правильно. Клиент должен разорвать соединение. Если ваши соединения не закрыты, что-то не так с вашим приложением, а не с сервером.

5. Я вызываю connection.close(), но он все еще занят на сервере. Насколько я знаю, PostgreSQL возвращает его в собственный пул для повторного использования, но когда я устанавливаю новое соединение, postgre не забирает его из пула.

Ответ №1:

ага… Это была проблема в коде (один плохой парень не закрыл соединения)

Комментарии:

1. Есть какие-нибудь подсказки по устранению подобных проблем?

2. Я вручную проверил все места, когда мы подключались к базе данных. И в некоторых из них не был вызван метод close().