Параметры пула соединений с JDBC: DBCP против C3P0 - PullRequest
309 голосов
/ 06 февраля 2009

Какая библиотека пулов соединений лучше всего доступна для Java / JDBC?

Я рассматриваю 2 основных кандидата (бесплатно / с открытым исходным кодом):

Я много читал о них в блогах и на других форумах, но не смог прийти к решению.

Есть ли какие-либо соответствующие альтернативы этим двум?

Ответы [ 16 ]

177 голосов
/ 06 февраля 2009

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

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

C3P0 также надежно обрабатывает разъединения БД и прозрачное повторное соединение при возобновлении, тогда как DBCP никогда не восстанавливал соединения, если ссылка была удалена из-под него. Хуже того, DBCP возвращал объекты Connection приложению, для которого был нарушен базовый транспорт.

С тех пор мы использовали C3P0 в 4 основных потребительских веб-приложениях с высокой нагрузкой и никогда не оглядывались назад.

ОБНОВЛЕНИЕ: Оказывается, после многих лет сидения на полке народ Apache Commons вывел DBCP из состояния покоя , и теперь он снова активно разработанный проект. Таким образом, мой оригинальный пост может быть устаревшим.

При этом я еще не испытывал производительность этой новой обновленной библиотеки и не слышал о том, чтобы она была де-факто в какой-либо недавней среде разработки приложений.

174 голосов
/ 02 ноября 2009

Я приглашаю вас попробовать BoneCP - это бесплатно, с открытым исходным кодом и быстрее, чем доступные альтернативы (см. Раздел тестов).

Отказ от ответственности: я автор, поэтому вы можете сказать, что я предвзятый: -)

ОБНОВЛЕНИЕ: по состоянию на март 2010 года он по-прежнему примерно на 35% быстрее, чем новый переписанный пул Apache DBCP ("tomcat jdbc"). См. Динамическую ссылку на эталонный тест в разделе тестов.

Обновление № 2: (дек. '13) После 4 лет на вершине, теперь есть намного более быстрый конкурент: https://github.com/brettwooldridge/HikariCP

Обновление № 3: (сентябрь '14). На данный момент BoneCP считается устаревшим , рекомендуем перейти на HikariCP .

Обновление № 4: (апрель '15 г.) - у меня больше нет домена jolbox.com, но новый владелец сохранил старый контент, так что будьте осторожны.

16 голосов
/ 15 декабря 2010

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

Затем я попробовал пул соединений Tomcat .

Это было в два раза быстрее, чем c3p0 и исправило другие проблемы, которые у меня были с DBCP. Я провел много времени, исследуя и тестируя 3 пула. Мой совет, если вы развертываете в Tomcat, это использовать новый пул Tomcat JDBC.

14 голосов
/ 26 апреля 2009

При проблеме автоматического переподключения с DBCP пытался ли кто-либо использовать следующие 2 параметра конфигурации?

validationQuery="Some Query"

testOnBorrow=true
12 голосов
/ 18 декабря 2011

Уже несколько лет в работе используется DBCP. Он стабилен, выживает при перезагрузке сервера БД. Просто настройте это правильно. Требуется указать всего несколько параметров, поэтому не ленитесь. Вот фрагмент нашего системного производственного кода, в котором перечислены параметры, которые мы явно установили, чтобы он работал:

DriverAdapterCPDS driverAdapterCPDS = new DriverAdapterCPDS();
driverAdapterCPDS.setUrl(dataSourceProperties.getProperty("url"));
driverAdapterCPDS.setUser(dataSourceProperties.getProperty("username"));
driverAdapterCPDS.setPassword(dataSourceProperties.getProperty("password"));
driverAdapterCPDS.setDriver(dataSourceProperties.getProperty("driverClass"));

driverAdapterCPDS.setMaxActive(Integer.valueOf(dataSourceProperties.getProperty("maxActive")));
driverAdapterCPDS.setMaxIdle(Integer.valueOf(dataSourceProperties.getProperty("maxIdle")));
driverAdapterCPDS.setPoolPreparedStatements(Boolean.valueOf(dataSourceProperties.getProperty("poolPreparedStatements")));

SharedPoolDataSource poolDataSource = new SharedPoolDataSource();
poolDataSource.setConnectionPoolDataSource(driverAdapterCPDS);
poolDataSource.setMaxWait(Integer.valueOf(dataSourceProperties.getProperty("maxWait")));
poolDataSource.setDefaultTransactionIsolation(Integer.valueOf(dataSourceProperties.getProperty("defaultTransactionIsolation")));
poolDataSource.setDefaultReadOnly(Boolean.valueOf(dataSourceProperties.getProperty("defaultReadOnly")));
poolDataSource.setTestOnBorrow(Boolean.valueOf(dataSourceProperties.getProperty("testOnBorrow")));
poolDataSource.setValidationQuery("SELECT 0");
11 голосов
/ 01 апреля 2016

Другая альтернатива - HikariCP .

Вот сравнение тест

8 голосов
/ 07 января 2010

Вот некоторые статьи, которые показывают, что DBCP имеет значительно более высокую производительность, чем C3P0 или Proxool. Кроме того, по моему собственному опыту, c3p0 имеет некоторые приятные функции, такие как готовый пул операторов, и более настраиваемый, чем DBCP, но DBCP явно быстрее в любой среде, в которой я его использовал.

Разница между dbcp и c3p0? Совершенно ничего! (Блог разработчиков Sakai) http://blogs.nyu.edu/blogs/nrm216/sakaidelic/2007/12/difference_between_dbcp_and_c3.html

См. Также статью JavaTech «Showdown Pool Pool» в комментариях к сообщению в блоге.

7 голосов
/ 12 мая 2011

Dbcp готов к работе, если настроен правильно.

Например, он используется на коммерческом веб-сайте с 350000 посетителями в день и с пулами в 200 соединений.

Очень хорошо справляется с таймаутами, если вы правильно настроили его.

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

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

Тесты производительности, выполняемые tomcat jdbc pool, показывают, что он имеет лучшую производительность, чем cp30.

7 голосов
/ 01 сентября 2009

К сожалению, они все устарели. DBCP недавно был обновлен, двум другим по 2-3 года, со многими выдающимися ошибками.

7 голосов
/ 06 февраля 2009

Другая альтернатива, Proxool, упоминается в этой статье .

Возможно, вы сможете узнать, почему Hibernate связывает c3p0 для своей реализации пула соединений по умолчанию?

...