DataSource или ConnectionPoolDataSource для ресурсов сервера приложений JDBC - PullRequest
24 голосов
/ 28 июня 2011

При создании пулов соединений JNDI JDBC на сервере приложений я всегда определял тип как javax.sql.ConnectionPoolDataSource.Я никогда не задумывался об этом, так как всегда казалось естественным предпочесть пул соединений вместо не пулов.

Однако, глядя на некоторые примеры ( специально для Tomcat ), я заметил, что ониукажите javax.sql.DataSource.Кроме того, кажется, есть настройки для maxIdle и maxWait, создающие впечатление, что эти соединения также объединены.Glassfish также позволяет использовать эти параметры независимо от типа выбранного источника данных.

  • Объединены ли javax.sql.DataSource на сервере приложений (или в контейнере сервлета)?
  • Какие (если есть) преимуществаЕсть ли для выбора javax.sql.ConnectionPoolDataSource над javax.sql.DataSource (или наоборот)?

Ответы [ 3 ]

8 голосов
/ 28 июня 2011

Да, Tomcat по умолчанию использует пул Apache DBCP для источников данных, определенных как ресурсы контекста JNDI.

Из документации на http://tomcat.apache.org/tomcat-7.0-doc/jndi-resources-howto.html#JDBC_Data_Sources

ПРИМЕЧАНИЕ. - Поддержка источника данных по умолчанию в Tomcat основан на DBCP пул соединений от Commons проект. Однако возможно использовать любой другой пул соединений, который реализует javax.sql.DataSource, путем написать свой собственный ресурс завод, как описано ниже.

Копание источников Tomcat 6 показало, что они получают фабрику соединений таким образом (в случае, если вы не указываете свой собственный, используя атрибут фабрики контекста):

ObjectFactory factory = (ObjectFactory)Class.forName(System.getProperty("javax.sql.DataSource.Factory", "org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory")).newInstance();

И org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory, который реализует javax.naming.spi.ObjectFactory, заботится о создании экземпляров DataSource: http://www.jarvana.com/jarvana/view/org/apache/tomcat/tomcat-dbcp/7.0.2/tomcat-dbcp-7.0.2-sources.jar!/org/apache/tomcat/dbcp/dbcp/BasicDataSourceFactory.java?format=ok

Я вижу, что они создают экземпляры org.apache.tomcat.dbcp.dbcp.BasicDataSource: http://www.jarvana.com/jarvana/view/org/apache/tomcat/tomcat-dbcp/7.0.2/tomcat-dbcp-7.0.2-sources.jar!/org/apache/tomcat/dbcp/dbcp/BasicDataSource.java?format=ok

Как ни странно, этот класс не реализует сам ConnectionPoolDataSource, равно как и org.apache.tomcat.dbcp.dbcp.PoolingDataSource, который внутренне возвращается BasicDataSource. http://www.jarvana.com/jarvana/view/org/apache/tomcat/tomcat-dbcp/7.0.2/tomcat-dbcp-7.0.2-sources.jar!/org/apache/tomcat/dbcp/dbcp/PoolingDataSource.java?format=ok

Поэтому я предполагаю, что когда вы настроили ваши DataSources как javax.sql.ConnectionPoolDataSource, вы также использовали некоторую настраиваемую фабрику (это всего лишь предположение, но я полагаю, что в противном случае у вас были бы исключения приведения классов в Tomcat, поскольку их пул не t действительно предоставляют экземпляры javax.sql.ConnectionPoolDataSource, только javax.sql.DataSource).

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

5 голосов
/ 20 марта 2012

Что касается документации на Java, она содержит:

API Java 7 DataSource

Интерфейс DataSource реализован поставщиком драйверов.Существует три типа реализаций:

Базовая реализация - создает стандартный объект Connection

Реализация пула соединений - создает объект Connection, который автоматически участвует в пуле соединений.Эта реализация работает с менеджером пула соединений среднего уровня.

Реализация распределенной транзакции - создает объект Connection, который может использоваться для распределенных транзакций и почти всегда участвует в пуле соединений.Эта реализация работает с менеджером транзакций среднего уровня и почти всегда с менеджером пула соединений.

API Java 7 PooledConnection

An прикладной программист не использует интерфейс PooledConnection напрямую;скорее он используется инфраструктурой среднего уровня, которая управляет пулами соединений.

Когда приложение вызывает метод DataSource.getConnection, оно возвращает объект Connection. Если выполняется пул соединений, этот объект Connection фактически является дескриптором объекта PooledConnection , который является физическим соединением.

Диспетчер пула соединений , обычно этосервер приложений поддерживает пул объектов PooledConnection ....

В итоге вы просто используете DataSource и Connection классы и никогда PooledConnection / ConnectionPoolDataSource , если вы счастливый и нормальный программист.

Если вы реализуете сервер приложений, это другая история ...

5 голосов
/ 28 июня 2011

Насколько я понимаю, единственная цель ConnectionPoolDataSource - предоставить доступ к PooledConnection, который реализует пул native драйвером JDBC.В этом случае сервер приложений может реализовать пул соединений с помощью этого собственного интерфейса.

При использовании простого DataSource сервер приложений использует собственный пул вместо собственного.

Не могу сказать, какой подход лучше.

...