2013-08-26 4 views
3

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

Является ли это ошибкой или это «как указано»?

В руководстве говорится:

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

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

Спасибо, Milo

ответ

8

Я автор c3p0 и параграф, который вы цитируете.

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

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

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

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

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

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

+0

Вау, я благодарен вашему ответу и благодарю вас за разъяснение. Дизайн приложения выполняется много лет назад мной и коллегой. Мы многому научились с тех пор :) Вы принимаете код, который добавляет параметр 'inactiveConnectionTimout'? –

+0

в теории, я бы не стал против этой функции. но на самом деле это будет немного раздражать. внутренняя библиотека пула (com.mchange.v2.resourepool.BasicResourcePool) не имеет понятия, что ресурсы, которые он объединяет, могут быть «активными» или «неактивными». эта концепция должна быть добавлена ​​в «Индексные карты», которые записывают статус отдельных ресурсов (в режиме ТВЛ: не все ресурсы имеют статус активности, который можно отслеживать, поэтому должны быть переданы сигналы вне диапазона неизвестно или не применимо). –

+0

Затем генераторы кода для прокси должны быть изменены, чтобы сообщать о какой-либо деятельности их родительскому NewPooledConnection. NewPooledConnection будет хотеть сообщать о деятельности пулу, к которому он принадлежит, но (следуя спецификации спецификации JDBC), PooledConnections связывается с пулами только через события Connection и Statement, которые сообщают только о закрытии и ошибках. В случае с C3p0 NewPooledConnection необходимо определить настраиваемый тип события или провести прямую родительскую ссылку на активность отчета. –

0

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

Смежные вопросы