Параметры объединения пула с JDBC: DBCP vs C3P0

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

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

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

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

Ответы

Ответ 1

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

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

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

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

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

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

Ответ 2

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

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

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

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

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

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

Ответ 3

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

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

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

Ответ 4

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

validationQuery="Some Query"

testOnBorrow=true

Ответ 5

Используют 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");

Ответ 6

Другой альтернативой является HikariCP.

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

Ответ 7

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

Ответ 8

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

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

Ответ 9

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

Ответ 10

Dbcp - это готовая продукция, если она настроена правильно.

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

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

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

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

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

Ответ 11

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

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

Ответ 12

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

Ответ 13

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

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

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

Ответ 14

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

  • DBCP2
  • C3P0
  • Tomcat JDBC
  • HikariCP

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

Ответ 15

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

C3P0:

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

Поэтому именно поэтому c3p0 и другие пулы соединений также подготовили оператор caches-, что позволяет использовать код приложения, чтобы избежать всего этого. Заявления обычно хранятся в ограниченном пуле 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();

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

DBCP:

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

Благодаря :)

Ответ 16

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

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

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