Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

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

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

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

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

Другие советы

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

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

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

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

Обновление № 3:(14 сентября) Пожалуйста, рассматривайте BoneCP как устаревший на этом этапе рекомендуется переключиться на ХикариЧП.

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

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

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

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

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

validationQuery="Some Query"

testOnBorrow=true

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

Другой альтернативой является ХикариЧП.

Вот сравнение эталонный показатель

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

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

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

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

Dbcp готов к работе, если настроен должным образом.

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

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

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

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

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

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

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

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

Хорошей альтернативой, которая проста в использовании, является DbPool ( База данных ).

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

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

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

  • DBCP2 ( DBCP2 )
  • C3P0
  • Кот JDBC
  • ХикариЧП

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

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

C3P0:

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

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

Что еще хуже, DBCP возвращал объекты подключения в приложение, для которого произошел сбой базового транспорта.Распространенным вариантом использования 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, особенно из-за его способности выбрасывать соединения из пула, когда БД уходит, его неспособности повторно подключиться, когда БД возвращается, и его неспособности динамически добавлять объекты подключения обратно в пул (он навсегда зависает при чтении сокета ввода-вывода post JDBCconnect)

Спасибо :)

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

хикари > друид > UCP > c3p0 > DBCP

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top