До сих пор актуальным является DBCP (Apache Commons Database Connection Pooling)?

Спецификация JDBC 3.0 говорит о пуле соединений (и подготовленном заявлении).

У нас есть несколько автономных программ Java (то есть мы не используем сервер приложений), которые использовали DBCP для обеспечения объединения пулов. Должны ли мы продолжать использовать DBCP или можем ли мы использовать JDBC-предоставленный пул и избавиться от DBCP?

Мы используем MySQL (Connector/J) и в конечном итоге добавим поддержку SQL Server (jTDS); маловероятно, что мы будем поддерживать любые другие базы данных.

EDIT: см. комментарий ниже о моей попытке устранить библиотеку объединения пулов. Похоже, что DBCP по-прежнему актуальна (обратите внимание, что некоторые комментаторы рекомендовали C3P0 по DBCP).

Ответы

Ответ 1

На основе поощрения других плакатов я попытался исключить DBCP и напрямую использовать драйвер JDBC MySQL (Connector/J 5.0.4). Я не смог этого сделать.

Похоже, что, хотя драйвер действительно создает основу для объединения, он не обеспечивает самую важную вещь: фактический пул (для этого был полезен исходный код). Для предоставления этой части остается сервер приложений.

Я еще раз взглянул на документацию JDBC 3.0 (у меня есть напечатанная копия чего-то помеченного "Глава 11 Пул соединений", не знаю точно, откуда она взялась), и я вижу, что драйвер MySQL следит за документом JDBC.

Когда я смотрю на DBCP, это решение начинает иметь смысл. Хорошее управление пулами предоставляет множество возможностей. Например, когда вы очищаете неиспользуемое соединение? какие соединения вы чистите? существует ли жесткое или мягкое ограничение максимального количества соединений в пуле? вы должны проверить соединение для "живой", прежде чем передать его вызывающему абоненту? и др.

Сводка: если вы выполняете автономное приложение Java, вам необходимо использовать библиотеку объединения пулов. Библиотеки пула подключений по-прежнему актуальны.

Ответ 2

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

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

Бассейны предназначены для повышения производительности, а не для их снижения. DBCP наивна, сложна и устарела.

Ответ 3

Я предпочитаю использовать dbcp или c3p0, потому что они нейтральны для поставщиков. Я узнал, по крайней мере, с mysql or oracle, что всякий раз, когда я пытаюсь что-то сделать с клиентом jdbc, который не является стандартным sql, мне приходится вводить зависимость времени компиляции от классов поставщиков. См., Например, очень раздражающий пример здесь.

Я не уверен в mysql, но oracle использует свои конкретные, нестандартные классы для пула соединений.

Ответ 4

Люди по-прежнему используют DBCP, я думаю, что он даже подходит по умолчанию в Hibernate.

Неужели DBCP не отвечает вашим текущим потребностям?

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