c3p0, похоже, закрывает активные соединения


Я установил unreturnedConnectionTimeout, чтобы освободить устаревшие соединения. Я предполагал, что это будет только закрывать соединения без какой-либо активности, но похоже, что это просто закрывает каждое соединение после указанного времени.

Это ошибка или это "как задумано"?

Руководство гласит:

unreturnedConnectionTimeout определяет ограничение (в секундах) на то, как долго a Соединение может оставаться проверенным. Если установлено нулевое значение, неиспользованные, проверенные соединения, превышающие это ограничение, будут вкратце уничтожили, а потом заменили в бассейне. Очевидно, вы необходимо позаботиться о том, чтобы установить этому параметру значение достаточно большое, чтобы все намеченные операции на проверенных соединениях успевают завершиться. Этот параметр можно использовать только для обхода ненадежных клиентских приложений что не удается закрыть () соединения

Из этого я заключаю, что деятельность не влияет на отбрасывание связей. Мне это кажется странным. Зачем выбрасывать активный связи?

Спасибо, Мило

2 3

2 ответа:

Я автор c3p0 и абзаца, который вы цитируете.

UnreturnedConnectionTimeout - это именно то, что указано в его названии и документации: тайм-аут для unreturned соединений. он был реализован неохотно, в ответ на отзывы пользователей, потому что это никогда не было бы необходимо или полезно, если бы клиенты надежно проверяли соединения, которые они проверяют. когда это было реализовано, я добавил второй незапрошенный конфигурационный параметр, debugUnreturnedConnectionStackTraces, чтобы поощряйте разработчиков исправлять клиентские приложения, а не лениво полагаться наunreturnedConnectionTimeout .

Нет ничего странного в определении unreturnedConnectionTimeout. как правило, приложения, использующие пул соединений, не проверяют соединения в течение длительного периода времени. это противоречит цели пула соединений, который позволяет приложениям получать соединения по мере необходимости без значительного снижения производительности. то альтернатива пулу соединений заключается в том, что приложение проверяет соединения и сохраняет их в течение длительного периода времени, поэтому они всегда доступны для использования. но поддержание долговременных соединений оказывается сложным, поэтому большинство приложений делегируют это в библиотеку пула, такую как c3p0.

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

C3p0-это, к сожалению, не та библиотека. c3p0 (как и большинство библиотек пула соединений) считает извлеченные соединения собственностью клиента и не выполняет никаких работ по их обслуживанию, пока они не будут возвращены обратно. есть два исключения из этого правила: это: unreturnedConnectionTimeout закроет() соединения из-под клиентов, если они были извлечены слишком долго, и c3p0 будет невидимо тестировать извлеченное соединение при возникновении исключений, чтобы определить, подходят ли соединения, которые испытали исключения, для возврата в пул или должны быть уничтожены при регистрации.

UnreturnedConnectionTimeout - это не тот параметр, который вам нужен. вы хотели бы что-то, что автоматически закрывается Соединения, когда они неактивны в течение определенного периода времени, но это позволяет проверять соединения бесконечно. такой параметр может быть назван inactiveConnectionTimout и является функцией, которая предположительно может быть добавлена к c3p0, но не была добавлена. вероятно, этого не произойдет, потому что немногие приложения удерживают проверенные соединения в течение длительного времени, и c3p0 полон функций, которые помогают вам наблюдать сбои после проверки соединений или при переходе соединений между проверенными и проверенными в.

В вашем (довольно необычном) случае это означает, что есть функция, которую вы хотели бы, которая просто не предоставляется библиотекой. я сожалею об этом!

unreturnedConnections может быть активным, это зависит от того, сколько времени требуется для выполнения, например. запрос к базе данных. Вы должны установить тайм-аут для него значение больше, чем самая длинная операция, которую вы можете ожидать с вашим приложением. Иногда, если вы знаете, что значение должно быть достаточным, а c3p0 все еще закрывает активные соединения, это означает, что соединение где-то просочилось (возможно, не закрыто должным образом).