Параметры пула соединений с JDBC: DBCP против C3P0


312

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

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

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

Есть ли уместные альтернативы этим двум?

Ответы:


181

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

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

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

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

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

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


2
Спасибо! Как насчет предлагаемой альтернативы Proxool? Текущая версия Hibernate поставляется с c3p0 и Proxool.
Дема

Мы не пробовали Proxool, но я обязательно проверю это сейчас :)
j pimmel

5
У c3p0 есть некоторые недостатки. иногда это не в состоянии обрабатывать пики соединения.
Janning 26.10.10

3
С тех пор, как вы впервые опубликовали этот ответ, ситуация сильно изменилась за четыре года. Можете ли вы добавить обновление, разделяющее текущий сценарий?
Раджат Гупта

13
Я очень рекомендую HikariCP , но потом помог написать.
Brettw

177

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

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

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

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

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

Обновление № 4: (апрель '15) - мне больше не принадлежит домен jolbox.com


1
Очень хотелось бы получить помощь при использовании BoneCP в качестве источника данных Tomcat. Основная проблема, с которой я столкнулся, заключалась в том, что для этого требовались классы BoneCP в директории lib tomcat, а также классы log4j и google. Это сделало работу пулов соединений - (они не работали в то время как в WAR) - однако это противоречило настройке log4j Tomcat и вообще предотвратило любой вывод журнала из приложения, которое было нарушителем ...
j pimmel

1
Это звучит как проблема log4j больше всего на свете. Напишите мне на forum.jolbox.com, и я помогу вам найти его как можно скорее.
wwadge

3
Во-первых, BoneCP великолепен. Переключился с C3P0. Это даже позволило мне удалить мою зависимость от log4jdbc-remix, потому что это позволяет входить в оператор из коробки!
саб

68
+1 за обновление того, что вы не написали, быстрее!
CorayThan

1
@AndrewScottEvans Вероятно, лучше всего вернуться к v0.7.1
wwadge

16

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

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

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


14

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

validationQuery="Some Query"

testOnBorrow=true

Что касается документации , testOnBorrowимеет значение по умолчанию true, поэтому, если validationQueryоно определено, DBCP будет проверять каждое соединение, прежде чем оно будет передано приложению.
dma_k


12

Уже несколько лет использую 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");

8

Вот несколько статей, которые показывают, что 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» в комментариях к сообщению в блоге.


4
Быстрее в однопоточных средах, может быть, с ошибками и нестабильно, и просто сломан где-то еще.

7

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

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


7

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


Это правда - последний выпуск C3PO (предварительный выпуск 0.9) - с мая 2007 года. Последний выпуск Proxool (предварительный выпуск 0.9) - с августа 2008 года. Последний выпуск DBCP также выпущен в апреле 2007 года, но по крайней мере, стабильный релиз 1.2. Есть ли что-нибудь на самом деле поддерживается там?
Guss

4
Чтобы быть справедливым, это не большие проекты, поэтому вы должны ожидать все меньше и меньше обновлений в C3P0 / DBCP, и время идет.
wwadge

7

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

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

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

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

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

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


UBIK LOAD PACK - мы используем DBCP 1.4 и постоянно зависаем от одной партии с 10000 записями. Мы используем Spring Batch + JSR 352 и думаем о переходе на HikariCP. Когда вы говорите, что сотни партий работают без сбоев, вы имеете в виду, что они работают с DBCP 2.x или любой другой версией? Кроме того, не могли бы вы поделиться настройками? Наша конфигурация maxActive = 150, minIdle = 15, maxIdle = 75, initialSize = 15, но мы не видели, как зависания исчезли. Мы не используем какие-либо validationQuery или testOnBorrow / testOnReturn. Вы рекомендуете использовать это?
Йогендра

4

Просто закончил тратить полтора дня с DBCP. Несмотря на то, что я использую последнюю версию DBCP, я столкнулся с теми же проблемами, что и j pimmel . Я бы вообще не рекомендовал DBCP, особенно это умение выбрасывать соединения из пула, когда БД уходит, невозможность переподключения при возврате БД и неспособность динамически добавлять объекты соединений обратно в пул (он навсегда зависает на пуле). сообщение JDBCconnect I / O сокет читать)

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


4

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


3

Хорошей альтернативой, которая проста в использовании, является DBPool .

«Утилита пула соединений с базой данных на основе Java, поддерживающая истечение срока действия, кэширование операторов, проверка соединения и простая настройка с помощью диспетчера пула»

http://www.snaq.net/java/DBPool/


Я тестировал DBPool против BoneCP. DBPool делает синхронизацию getConnection () между прочим и намного медленнее, чем BoneCP (см .: jolbox.com/forum/viewtopic.php?f=3&t=175 ).
wwadge

3

Мы столкнулись с ситуацией, когда нам нужно было ввести пул соединений, и перед нами было 4 варианта.

  • DBCP2
  • C3P0
  • Tomcat JDBC
  • HikariCP

Мы провели несколько тестов и сравнений на основе наших критериев и решили перейти на HikariCP. Прочитайте эту статью, которая объясняет, почему мы выбрали HikariCP.


1

Чтобы реализовать C3P0 наилучшим образом, проверьте этот ответ

C3P0 :

Для корпоративных приложений C3P0 является лучшим подходом. C3P0 - это простая в использовании библиотека для расширения традиционных (основанных на DriverManager) драйверов JDBC с помощью JNDI-связанных источников данных, включая источники данных, которые реализуют пул соединений и операторов, как описано в спецификации jdbc3 и расширении jdbc2 std. C3P0 также надежно обрабатывает разъединения БД и прозрачное повторное соединение при возобновлении, тогда как DBCP никогда не восстанавливал соединения, если ссылка была удалена из-под него.

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

Хуже того, DBCP возвращал объекты Connection приложению, для которого был нарушен базовый транспорт. Распространенным вариантом использования c3p0 является замена стандартного пула соединений DBCP, включенного в Apache Tomcat. Часто программист сталкивается с ситуацией, когда соединения неправильно перезаписываются в пуле соединений DBCP, и в этом случае c3p0 является ценной заменой.

В текущих обновлениях C3P0 имеет несколько блестящих функций. те даны ниже:

ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setMinPoolSize();
dataSource.setMaxPoolSize();
dataSource.setMaxIdleTime();
dataSource.setMaxStatements();
dataSource.setMaxStatementsPerConnection();
dataSource.setMaxIdleTimeExcessConnections();

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

DBCP :

Этот подход также хорош, но имеет некоторые недостатки, такие как время ожидания соединения и повторное освобождение соединения. C3P0 хорош, когда мы используем проекты с многопоточностью. В наших проектах мы использовали одновременное выполнение нескольких потоков с использованием DBCP, затем мы получили тайм-аут соединения, если мы использовали большее количество потоков. Итак, мы пошли с конфигурацией c3p0. Я бы вообще не рекомендовал DBCP, особенно это умение выбрасывать соединения из пула, когда БД уходит, его невозможность переподключения при возврате БД и его неспособность динамически добавлять объекты соединений обратно в пул (он навсегда зависает на пуле). сообщение JDBCconnect I / O сокет читать)

Спасибо :)


1

моя рекомендация

hikari> друид> UCP> c3p0> DBCP

Он основан на том, что я тестировал - 20190202, в моей локальной тестовой среде (4 ГБ mac / mysql в докере / пуле minSize = 1, maxSize = 8), hikari может обслуживать 1024 потока x 1024 раза для получения соединений, среднее время для каждого потока до конца 1 или 2 миллиона секунд, в то время как c3p0 может обслуживать только 256 потоков x 1024 раза, а среднее время для каждого потока уже составляет 21 миллион секунд. (512 потоков не удалось).

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.