tomcat-dbcp vs commons-dbcp - PullRequest
       33

tomcat-dbcp vs commons-dbcp

67 голосов
/ 17 января 2011

Кажется, что между этими двумя библиотеками пула соединений существует большая путаница.То, что я хочу знать, какой из них лучше (если вообще)?

Вот некоторые моменты, которые я хотел бы поднять ... Может ли кто-нибудь проверить?

  1. Tomcat DBCP: использует файл tomcat-dbcp.jar по умолчанию, который будет присутствовать в вашем каталоге tomcat / lib.Вы не нуждаетесь в библиотеках commons-dbcp.jar или commons-pool.jar в вашем web-inf / lib.Драйвер БД должен быть помещен в tomcat / lib.

  2. Класс источника данных Tomcat DBCP равен org.apache.tomcat.dbcp.dbcp.BasicDataSource.Класс источника данных DBCP Commons: org.apache.commons.dbcp.BasicDataSource.

  3. Единственное различие между этими двумя можно найти в этом блоге .Не знаю, правильна ли информация или нет.

  4. В официальной документации Tomcat четко упоминается, что большинство классов были только что переименованы и переупакованы.

Итак, вопрос: какой использовать, а какой лучше ?

Ответы [ 6 ]

34 голосов
/ 25 апреля 2012

Tomcat DBCP - это просто переименованная версия Apache Commons DBCP с другим внутренним префиксом имени пакета.

Во время сборки Tomcat выбирает источники Commons DBCP (версия зависит от версии Tomcat, дляэкземпляр Tomcat 7.0.27 использует Commons DBCP 1.4) и выполняет замену имени пакета (org.apache.commons -> org.apache.tomcat.dbcp) и создает результат как tomcat-dbcp.jar.

. Это делается для того, чтобы внутренний JDBC Tomcatпулы никогда не вступают в конфликт с возможным использованием приложениями классов Commons DBCP.Это позволяет избежать многих потенциальных проблем с загрузкой классов.

Редактировать: Пакеты "dbcp" посвящены управлению источниками данных.Для реализации чистого пула, Commons DBCP зависит от пула Commons (пакет org.apache.commons.pool), но в Tomcat реализация пула заменяется собственным JDBC-пулом Tomcat (пакет org.apache.tomcat.jdbc.pool).

14 голосов
/ 25 марта 2015

Кажется, между этими двумя библиотеками пула соединений существует большая путаница. Что я хочу знать, какой из них лучше (если вообще)?

TL / DR: это одно и то же, не используйте ни один из них.

Tomcat-dbcp - это оригинальный пакет пакетов Apache Commons, включенный в дистрибутив Tomcat. Во избежание столкновения классов пакет был переименован в org.apache.tomcat.dbcp.dbcp. *

В Tomcat 7 (начиная с 7.0.19 в июле 2011 года) в пакет Tomcat по умолчанию был включен дополнительный пул соединений (как часть tomcat-jdbc.jar) в качестве альтернативы устаревшей реализации Apache Commons, называемой «Соединение Tomcat JDBC бассейн ":

https://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html

В этой статье рассматриваются различия между ними:

http://vigilbose.blogspot.com/2009/03/apache-commons-dbcp-and-tomcat-jdbc.html

Краткое резюме, почему новый пул Tomcat лучше:

  • активно поддерживается
  • намного меньше, легче для понимания и поддержки (если вы хотите посмотреть на источник)
  • поддерживает все функции commons-dbcp + добавляет супер полезные функции, такие как "initSQL", "validationInterval", "jdbcInterceptors" и другие
11 голосов
/ 17 января 2011

В старых версиях Apache Commons DBCP (т.е. версии 1.2) возникали некоторые неприятные проблемы с безопасностью потоков в условиях высокой нагрузки, что делало его непригодным для такого использования. Меня не удивляет, что ребята из Tomcat переработали его, чтобы исправить эти проблемы.

Однако, насколько я понимаю, Commons DBCP 1.4 решает эти проблемы. Я не могу подтвердить это лично, но это может сделать версию Tomcat избыточной.

Интересно, что SpringSource также переписал Commons DBCP для своей перепакованной версии Tomcat (tc-Server), и они претендуют на большие преимущества в производительности. Они не открыли это, однако.

6 голосов
/ 24 ноября 2012

Tomcat 7 продолжает использовать DBCP. Основная причина может быть скрыта в их документах Tomcat:

  • Apache Commons DBCP можно настроить для отслеживания и восстановления этих данных. оставленные соединения с базой данных. Он может не только восстановить их, но и генерировать трассировку стека для кода, который открыл эти ресурсы и никогда их не закрывал.

  • Библиотека Tomcat jdbc-pool, может быть быстрее в сильно параллельных сценариях, но не может закрыться и автоматически высвобождать операторы (которые разработчик забыл закрыть), что приводит к возможные утечки памяти в некоторых драйверах jdbc.

Однако одной из проблем с кодом DBCP является модель делегирования, которую они используют, в настоящее время их последние версии поддерживают JDK1.6 и ниже. Поддержка 1.7 означает изменение как минимум четвертой части их классов, что стало одной из причин появления библиотеки JDBC-пулов.

ПРИМЕЧАНИЕ. После дальнейшего изучения в пуле JDBC есть способ закрытия открывающих операторов при закрытии соединения с использованием перехватчика StatementFinalizer.

4 голосов
/ 13 марта 2013

Вот список преимуществ использования пула Tomcat JDBC, а не commons-dbcp: http://people.apache.org/~fhanik/jdbc-pool/jdbc-pool.html

4 голосов
/ 15 февраля 2013

Просто добавьте сюда: Я заметил интересное поведение, хотя ожидается, но не смог найти никакой документации для этого:

Для Tomcat вам нужно определить фабрику Tomcat (org.apache.tomcat.jdbc.pool.DataSourceFactory или другие фабрики Tomcat), иначе она будет работать как Common DBCP.

Существуют различия между значениями по умолчанию Common DBCP и Tomcat DBCP, особенно testOnBorrow (true в Common DBCP, но false в Tomcat DBCP).

...