Параметры пула соединений с JDBC: DBCP против C3P0
Какая библиотека пулов соединений лучше всего доступна для Java/JDBC?
Я рассматриваю 2 основных кандидата (бесплатно / с открытым исходным кодом):
- Apache DBCP - http://commons.apache.org/dbcp/
- C3P0 - http://sourceforge.net/projects/c3p0
Я много читал о них в блогах и на других форумах, но не смог прийти к решению.
Есть ли уместные альтернативы этим двум?
16 ответов
DBCP устарел и не выпускается. Некоторое время назад мы провели внутренний анализ этих двух, создав тестовое устройство, которое генерировало нагрузку и параллелизм по отношению к обоим, чтобы оценить их пригодность в реальных условиях.
DBCP последовательно генерировал исключения в нашем тестовом приложении и изо всех сил пытался достичь уровней производительности, которые C3P0 был более чем способен обрабатывать без каких-либо исключений.
C3P0 также надежно обрабатывает разъединения БД и прозрачное повторное соединение при возобновлении, тогда как DBCP никогда не восстанавливал соединения, если ссылка была удалена из-под него. Хуже того, DBCP возвращал объекты Connection приложению, для которого был нарушен базовый транспорт.
С тех пор мы использовали C3P0 в 4 основных потребительских веб-приложениях с высокой нагрузкой и никогда не оглядывались назад.
ОБНОВЛЕНИЕ: Оказывается, после многих лет сидения на полке люди из Apache Commons вывели DBCP из состояния покоя, и теперь это снова активно развивающийся проект. Таким образом, мой оригинальный пост может быть устаревшим.
Тем не менее, я еще не испытывал производительность этой новой обновленной библиотеки и не слышал о том, что она была де-факто в какой-либо недавней среде разработки приложений.
Я приглашаю вас попробовать BoneCP - это бесплатно, с открытым исходным кодом и быстрее, чем доступные альтернативы (см. Раздел тестов).
Отказ от ответственности: я автор, так что вы можете сказать, что я предвзятый:-)
ОБНОВЛЕНИЕ: По состоянию на март 2010 года, он все еще примерно на 35% быстрее, чем новый переписанный пул Apache DBCP ("tomcat jdbc"). Смотрите ссылку на динамический тест в разделе тестов.
Обновление № 2: (Dec '13) После 4 лет на вершине, теперь есть гораздо более быстрый конкурент: https://github.com/brettwooldridge/HikariCP
Обновление № 3: (сентябрь '14). Считайте, что BoneCP устарела на этом этапе, рекомендуем перейти на HikariCP.
Обновление № 4: (апрель '15 г.) - у меня больше нет домена jolbox.com, но новый владелец сохранил старый контент, так что будьте осторожны.
У меня были проблемы с DBCP, когда время соединения истекло, поэтому я попробовал c3p0. Я собирался выпустить это в производство, но затем начал тестирование производительности. Я обнаружил, что c3p0 работал ужасно. Я не мог настроить его так, чтобы он работал хорошо. Я нашел это в два раза медленнее, чем DBCP.
Затем я попробовал пул соединений Tomcat.
Это было в два раза быстрее, чем c3p0 и исправило другие проблемы, которые у меня были с DBCP. Я провел много времени, исследуя и тестируя 3 пула. Мой совет, если вы развертываете в Tomcat, это использовать новый пул Tomcat JDBC.
Для проблемы автоматического переподключения с 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 "Showdown Pool Pool" в комментариях к сообщению в блоге.
Другая альтернатива, Proxool, упоминается в этой статье.
Возможно, вы сможете узнать, почему Hibernate связывает c3p0 для реализации пула соединений по умолчанию?
К сожалению, они все устарели. DBCP недавно был обновлен, двум другим по 2-3 года, со многими выдающимися ошибками.
Dbcp готов к работе, если настроен правильно.
Например, он используется на коммерческом веб-сайте с 350000 посетителями в день и с пулами в 200 соединений.
Он отлично справляется с таймаутами, если вы правильно его настроили.
Версия 2 находится в процессе разработки и имеет фон, который делает ее надежной, поскольку многие производственные проблемы были решены.
Мы используем его для нашего пакетного серверного решения, и оно запускает сотни пакетов, которые работают с миллионами строк в базе данных.
Тесты производительности, выполняемые tomcat jdbc pool, показывают, что он имеет лучшую производительность, чем cp30.
Моя рекомендация
hikari > друид> UCP > c3p0 > DBCP
Он основан на том, что я тестировал - 20190202, в моей локальной тестовой среде (4 ГБ mac/mysql в докере / пуле minSize=1, maxSize=8), hikari может обслуживать 1024 потока x 1024 раза для получения соединений, среднее время для каждого потока до конца 1 или 2 миллиона секунд, в то время как c3p0 может обслуживать только 256 потоков x 1024 раза, а среднее время для каждого потока уже составляет 21 миллион секунд. (512 потоков не удалось).
c3p0 хорош, когда мы используем проекты с многопоточностью. В наших проектах мы использовали одновременное выполнение нескольких потоков с использованием DBCP, затем мы получали тайм-аут соединения, если мы использовали большее количество потоков. Итак, мы пошли с конфигурацией c3p0.
Просто закончил тратить полтора дня с DBCP. Несмотря на то, что я использую последнюю версию DBCP, я столкнулся с теми же проблемами, что и j pimmel. Я бы вообще не рекомендовал DBCP, особенно это умение выбрасывать соединения из пула, когда БД уходит, невозможность переподключения при возврате БД и неспособность динамически добавлять объекты соединений обратно в пул (он навсегда зависает на пуле). сообщение JDBCconnect I/O сокет читать)
Я перехожу на C3P0 сейчас. Я использовал это в предыдущих проектах, и это работало и работало как шарм.
Хорошей альтернативой, которая проста в использовании, является DBPool.
"Утилита пула соединений с базой данных на основе Java, поддерживающая истечение времени, кэширование операторов, проверка соединения и простота настройки с помощью диспетчера пула".
Мы столкнулись с ситуацией, когда нам нужно было ввести пул соединений, и перед нами было 4 варианта.
- DBCP2
- C3P0
- Tomcat JDBC
- HikariCP
Мы провели несколько тестов и сравнений на основе наших критериев и решили пойти на HikariCP. Прочитайте эту статью, которая объясняет, почему мы выбрали HikariCP.
Чтобы реализовать 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 сокет читать)
Спасибо:)