Является ли DBCP (объединение пулов соединений с базой данных Apache Commons) все еще актуальным?
-
20-08-2019 - |
Вопрос
В спецификации JDBC 3.0 говорится о объединении соединений (и подготовленных инструкций).
У нас есть несколько автономных Java-программ (т.е.мы не используем сервер приложений), которые использовали DBCP для обеспечения пула соединений.Должны ли мы продолжать использовать DBCP, или мы можем воспользоваться преимуществами пула, предоставляемого JDBC, и избавиться от DBCP?
Мы используем MySQL (Connector / J) и в конечном итоге добавим поддержку SQL Server (jTDS);маловероятно, что мы будем поддерживать какие-либо другие базы данных.
Редактировать:Смотрите комментарий ниже о моей попытке устранить библиотеку пула подключений.Похоже, что DBCP все еще актуален (обратите внимание, что некоторые комментаторы рекомендовали C3P0 вместо DBCP).
Решение
Основываясь на рекомендациях других постеров, я попытался исключить DBCP и напрямую использовать драйвер MySQL JDBC (Connector /J 5.0.4).Я был не в состоянии этого сделать.
Похоже, что, хотя драйвер и обеспечивает основу для объединения, он не обеспечивает самого важного:настоящий пул (для этого пригодился исходный код).Предоставление этой части остается на усмотрение сервера приложений.
Я еще раз взглянул на документацию JDBC 3.0 (у меня есть распечатанная копия чего-то с надписью "Объединение пулов соединений главы 11", не уверен точно, откуда она взялась), и я вижу, что драйвер MySQL соответствует документу JDBC.
Когда я смотрю на DBCP, это решение начинает приобретать смысл.Хорошее управление пулом предоставляет множество возможностей.Например, когда вы удаляете неиспользуемое соединение?какие связи вы удаляете?существует ли жесткое или мягкое ограничение на максимальное количество подключений в пуле?должны ли вы проверить соединение на "живучесть", прежде чем передавать его вызывающему абоненту?и т.д.
Краткие сведения:если вы создаете автономное Java-приложение, вам необходимо использовать библиотеку пула подключений.Библиотеки пулов соединений по-прежнему актуальны.
Другие советы
DBCP имеет серьезные недостатки.Я не думаю, что это подходит для производственного приложения, особенно когда так много драйверов поддерживают объединение в своих DataSource
изначально.
Соломинкой, которая сломала спину верблюду, в моем случае, стало то, что я обнаружил, что весь пул был заблокирован все время, пока предпринималась новая попытка подключения к базе данных.Таким образом, если с вашей базой данных что-то случается, что приводит к медленным соединениям или тайм-аутам, другие потоки блокируются при попытке вернуть соединение с пулом, даже если они выполняются с использованием базы данных.
Пулы предназначены для повышения производительности, а не для ее снижения.DBCP наивен, сложен и устарел.
Я предпочитаю использовать dbcp или c3p0, потому что они нейтральны к поставщику.Я обнаружил, по крайней мере, с mysql или oracle, что всякий раз, когда я пытаюсь что-то сделать с клиентом jdbc, который не является стандартным sql, мне приходится вводить зависимость во время компиляции от классов поставщика.Смотрите, например, очень раздражающий пример здесь.
Я не уверен насчет mysql, но oracle использует свои специфические нестандартные классы для объединения в пул соединений.
Люди все еще используют DBCP, я думаю, что он даже поставляется по умолчанию с Hibernate.
DBCP не соответствует вашим текущим потребностям?
Я не очень верю в замену инфраструктуры, если только уже не существует пробел в производительности или функциональности, который она не может заполнить, даже если существуют более новые или причудливые альтернативы.