Какой из них лучше использовать MySQL в Tomcat:
A) назначить соединение с БД для пользователя, пока сеанс действителен. [ИЛИ]
B) открыть соединение с БД, при каждом запросе на сервер и когда он будет выполнен, закройте его.
C) Пул соединений. [Лучший ответ]
Лучшее использование MySQL в Tomcat?
Ответы (2)
Импетус
В любой системе типа запрос-ответ - будь то http, ftp или вызов базы данных - имеет смысл держать пул соединений открытым для использования клиентом. Стоимость создания и разрыва соединения во время каждого отдельного запроса высока (как для клиента, так и для сервера), поэтому наличие пула, из которого несколько потоков могут «проверять» соединение для своего использования, является хорошим шаблоном.
Выполнение
JDBC API предоставляет оболочку для любого количества реализаций базы данных, что означает, что вызывающие могут быть (в основном) агностиком относительно того, какую базу данных они вызывают. Эта абстракция позволила кодировщикам создавать универсальные библиотеки, которые обеспечивают пул соединений для любого типа соединения JDBC.
Вот страница Sun о пуле подключений и вот один из MySQL.
Поскольку вызывающий объект предположительно использует только методы JDBC, checkout может выглядеть как запрос на создание соединения, а checkin - это просто вызывающий объект, закрывающий соединение, т.е. вызывающий абонент не знает, что они используют пул соединений, потому что семантика неотличима от используя решение для создания / разрыва единого соединения. Это хорошая вещь; это настоящий ОО.
Библиотеки
Итак, какие библиотеки доступны, чтобы упростить эту задачу?
c3p0 - названная в честь всеми любимого протокольного дроида, эта библиотека обеспечивает объединение подключений и подготовленный пул операторов (я считаю, что это пул объектов из
PreparedStatementобъектов).Документация на их веб-сайте довольно тщательная. На самом деле у меня на столе распечатана физическая копия, потому что мне нужно с ней обращаться, когда я настраиваю. Вся конфигурация выполняется в стиле JavaBeans, что упрощает работу с ним.
Он широко развернут и выдерживает давление. Я использовал его для выполнения десятков, если не сотен тысяч транзакций в секунду с несколькими машинами и несколькими потоками на машину, подключенными к нескольким базам данных.
Похоже, у них есть приложение, посвященное настройке c3p0 для использования. от Tomcat, так что вы можете проверить это.
DBCP. Менее креативно названная Apache DBCP (для «Пула подключений к базе данных») в значительной степени то же самое, что и c3p0. Это обсуждение, похоже, не одобряет его использование, утверждая, что c3p0 поддерживается более активно. Я действительно не могу вспомнить, почему я выбрал c3p0 вместо DBCP для моего последнего проекта (вероятно, знакомый), но если вы хотите взглянуть на DBCP, продолжайте.
Вот несколько вопросов о DBCP:
- Connection pooling options with JDBC: DBCP vs C3P0
- Актуален ли DBCP (пул соединений базы данных Apache Commons)? а>
Ненавижу быть отрицательной, Нэнси, но я не думаю, что DBCP - это то, что вам нужно.
BoneCP - возможно, креативно названо, но звучит немного странно. Я никогда этим не пользовался. Автор говорит, что это очень быстро, и он может быть прав. Это кажется наименее зрелым - по крайней мере, временно - из всех ваших вариантов, но вы должны попробовать и посмотреть, отвечает ли он вашим потребностям.
Недостатки
Вы оборачиваете свой DataSource в какой-то другой класс, похожий на прокси, поэтому методы, зависящие от поставщика, скорее всего, будут недоступны. В этом нет ничего страшного: вы все равно не должны писать код БД, зависящий от поставщика.