Параметри об'єднання з'єднань за допомогою JDBC: DBCP vs 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 має деякі недоліки. іноді не вдається обробити вершини з'єднання.
січня

3
все змінилося дуже сильно за 4 роки, коли ви вперше опублікували цю відповідь, чи можете ви додати оновлення, що ділиться поточним сценарієм, якщо це можливо?
Rajat Gupta

13
Я дуже рекомендую HikariCP , але потім я допоміг написати його.
brettw

177

Я запрошую вас спробувати BoneCP - це безкоштовно, з відкритим кодом та швидше, ніж доступні альтернативи (див. Розділ еталону).

Відмова: Я автор, щоб ви могли сказати, що я упереджений :-)

ОНОВЛЕННЯ: Станом на березень 2010 року, все ще приблизно на 35% швидше, ніж новий переписаний пул DBCP Apache ("tomcat jdbc"). Див. Динамічне посилання на орієнтир у розділі орієнтирів.

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

Оновлення №3: (вересень 14 р.) Будь ласка, вважайте, що BoneCP застарілим у цей момент, рекомендуємо перейти на HikariCP .

Оновлення №4: (квітень 15 року) - я більше не володію доменом jolbox.com


1
Дуже любить отримати проблему, використовуючи BoneCP як Tomcat Datasource. Основна проблема, з якою у мене виникло, полягала в тому, що для цього потрібні класи BoneCP у режимі lic dir, а також класи log4j та google. Це дозволило пулам підключень працювати ((він не працював, поки він не працював) - однак це суперечило налаштуванню Tom4at log4j і взагалі заважало виводити журнал із програми, яка була зловмисником ...
j pimmel

1
Це здається проблемою log4j більше, ніж будь-що інше. Надіньте мені рядок на forum.jolbox.com, і я допоможу вам відстежити це якнайшвидше.
wwadge

3
1уп, BoneCP - блискучий. Вимкнено з C3P0. Це навіть дозволило мені зняти свою залежність від log4jdbc-remix, оскільки це дозволяє виходити з оператора з поля!
subes

68
+1 за оновлення про те, про що ви не написали, швидше!
CorayThan

1
@AndrewScottEvans Напевно, найкраще повернутись до v0.7.1
wwadge

16

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

Потім я спробував об'єднати з'єднання Tomcat .

Це було вдвічі швидше, ніж c3p0 і виправляло інші проблеми, які виникли у мене з DBCP. Я витратив багато часу на дослідження та тестування 3 басейнів. Моя порада, якщо ви розгортаєтесь у Tomcat, - це використовувати новий пул Tomcat JDBC.


14

Для проблеми з автоматичним відновленням зв’язку з DBCP, будь-хто намагався використовувати наступні два параметри конфігурації?

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 "З'єднання Pool Showdown" у коментарях до повідомлення в блозі.


4
швидше в середовищі з однією різьбою, можливо, баггі та нестабільні та просто зламані деінде.

7

Ще одна альтернатива, Proxool, згадується в цій статті .

Можливо, ви зможете дізнатися, чому сплячі сплячки c3p0 для його реалізації пулу з'єднань за замовчуванням?


7

На жаль, всі вони застаріли. DBCP нещодавно оновлено, іншим двом - 2-3 роки, з багатьма видатними помилками.


Це правда - останній реліз C3PO (попередній реліз 0,9) - з травня 2007 року. Останній випуск Proxool (попередній реліз 0,9) - з серпня 2008 року. Останній випуск DBCP також з квітня 2007 року, але принаймні, його стабільний 1.2 випуск. Чи щось насправді підтримується там?
Гасс

4
Для справедливості це не великі проекти, тому слід очікувати все меншої та меншої кількості оновлень у C3P0 / DBCP і час проходить.
wwadge

7

Dbcp готовий до виробництва, якщо його правильно налаштувати.

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

Він обробляє дуже добре тайм-аути за умови правильного налаштування.

Версія 2 продовжує працювати, і вона має передумови, що робить її надійною, оскільки було вирішено багато виробничих проблем.

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

Тести на ефективність, виконані басейном tomcat jdbc, показують, що він має кращі показники, ніж cp30.


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

4

Щойно закінчив витрачати день-півтора на DBCP. Хоча я використовую останню версію DBCP, я зіткнувся з абсолютно тими ж проблемами, що й j pimmel . Я б зовсім не рекомендував DBCP, особливо це спритність викидання з'єднань з пулу, коли БД відходить, його неможливість повторного підключення, коли БД повертається, і її нездатність динамічно додавати об’єкти з'єднання назад у пул (він вічно зависає на повідомлення прочитання гнізда JDBCconnect вводу / виводу)

Я переходжу на 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 вводу / виводу)

Дякую :)


1

моя рекомендація така

hikari> druid> UCP> c3p0> DBCP

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.