Повторно использовать соединение при опросе базы данных в JDBC? - PullRequest
1 голос
/ 08 декабря 2008

Имеется сценарий использования, при котором необходимо поддерживать соединение открытым для базы данных, открытой для периодического выполнения запросов.

Желательно ли закрыть соединение после выполнения запроса, а затем снова открыть его после интервала периода (10 минут). Я думаю, нет, так как открытие соединения с базой данных стоит дорого.

Является ли пул соединений альтернативой и продолжает использовать соединения?

Ответы [ 5 ]

6 голосов
/ 08 декабря 2008

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

Как правило, открытие соединения «дорого», обычно из-за накладных расходов, связанных с установкой соединения TCP / IP, аутентификацией и т. Д. Однако поддерживать соединение открытым «слишком долго» может быть дорого, поскольку база данных (вероятно) имеет зарезервированные ресурсы (например, память) для использования соединением. Таким образом, поддержание открытого соединения может связать эти ресурсы.

Вы не хотите загрязнять код своего приложения, управляя этими типами компромиссов эффективности, поэтому используйте пул соединений.

1 голос
/ 08 декабря 2008

Ответ здесь действительно зависит от приложения. Если есть другие соединения, которые одновременно используются для одной и той же базы данных из того же приложения, то пул, безусловно, ваш ответ.

Если все ваше приложение делает запрос к БД, подождите 10 минут, затем запросите снова, затем просто подключитесь и переподключитесь. Соединение считается дорогой операцией, но все относительно. Это не дорого, если вы делаете это только один раз каждые 10 минут. Если приложение очень простое, не вносите ненужных сложностей.

Примечание: Хорошо, сложность также относительна, поэтому, если вы уже используете что-то вроде Spring и уже знаете, как использовать механизм объединения, примените его для этого случая. Если это не так, сделайте это просто.

1 голос
/ 08 декабря 2008

Да, пул соединений является альтернативой. Открывайте соединение каждый раз (насколько это касается вашего кода) и закрывайте его как можно быстрее. Пул соединений будет обрабатывать физическое соединение надлежащим образом (включая все необходимые сообщения поддержки активности, периодические тесты «живучести» и т. Д.).

Я не знаю, каково текущее состояние дел, но я очень успешно использовал c3p0 для моего последнего Java-проекта с участием JDBC (довольно давно).

0 голосов
/ 10 декабря 2008

Существует много, много компромиссов при открытии и закрытии соединений, сохранении их открытыми, проверке того, что соединения, которые были "оставлены в живых", остаются "действительными", когда вы начинаете их использовать снова, аннулировании соединений, которые повреждены и т. Д. Подобные сложные компромиссы затрудняют (но, конечно, не делают невозможным) реализацию «наилучшей» стратегии управления соединениями для вашего конкретного случая. Самый безопасный метод - открыть соединение, использовать его, а затем закрыть. Но, как вы уже поняли, это вовсе не самый эффективный метод. Если вы управляете своими собственными соединениями, то по мере того, как вы делаете вещи, чтобы сделать вашу стратегию более эффективной, сложность возрастает очень быстро (особенно при наличии каких-то неидеальных драйверов JDBC, которых много.)

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

Я успешно использовал C3P0 и Apache DBCP . Если бы я выбрал сегодня снова, я бы, вероятно, пошел с DBCP.

0 голосов
/ 08 декабря 2008

Пул соединений будет для вас вариантом. Затем вы можете оставить свой код, как он включает в себя открытие и закрытие соединений. Пул соединений будет заботиться о соединениях. Если вы закроете подключение к пулу, оно не будет закрыто, а просто снова будет доступно в пуле. Если вы открываете соединение после того, как закрыли его, если в пуле есть открытое соединение, пул вернет это. Таким образом, на сервере приложений вы можете использовать встроенные пулы соединений. Для простых Java-приложений большинство драйверов JDBC также содержат драйвер пула.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...