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

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

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

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

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

Ответы [ 16 ]

4 голосов
/ 15 июля 2011

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

4 голосов
/ 14 августа 2010

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

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

3 голосов
/ 13 февраля 2018

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

  • DBCP2
  • C3P0
  • Tomcat JDBC
  • HikariCP

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

3 голосов
/ 21 августа 2010

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

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

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

1 голос
/ 14 августа 2018

Чтобы реализовать 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();

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

ДБХП :

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

Спасибо:)

0 голосов
/ 02 февраля 2019

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

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

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

...