Статьи

Понимание пула соединений

1. Введение

Пул соединений — это метод повышения производительности приложения, когда N соединений с базой данных открываются и управляются в пуле. Приложение просто запрашивает соединение, использует его и затем отбрасывает обратно в пул. Когда приложение требует подключения, готовые подключения остаются доступными для использования в пуле. Пул управляет жизненным циклом соединения, так что разработчику фактически не нужно ждать установления соединения и отфильтровывать устаревшие.

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

2. Реализация пула соединений в Tomcat

Tomcat , ведущий сервер приложений, поставляется с источником данных Commons DBCP в качестве источника данных JNDI по умолчанию, если только мы явно не укажем DataSourceFactory как —

Чтобы использовать пул соединений Apache Commons DBCP

1
2
3
4
5
<Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource"
    maxActive="100" maxIdle="30" maxWait="10000"
    username="javauser" password="javadude" driverClassName="com.mysql.jdbc.Driver"
    url="jdbc:mysql://localhost:3306/javatest"
        factory="org.apache.commons.dbcp.BasicDataSourceFactory"/>

Чтобы использовать Tomcat JDBC Connection pool

1
2
3
4
5
<Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource"
    maxActive="100" maxIdle="30" maxWait="10000"
    username="javauser" password="javadude" driverClassName="com.mysql.jdbc.Driver"
    url="jdbc:mysql://localhost:3306/javatest"
        factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"/>

фабрика обязательна, а тип всегда должен быть javax.sql.DataSource

Прелесть DBCP в том, что он может использоваться с таким количеством приложений или сред и работает практически со всеми базами данных на рынке.

3. Сравнение механизмов объединения

При использовании механизма пула соединений Commons DBCP Tomcat извлекает источники Commons DBCP (версия зависит от версии Tomcat, например, Tomcat 7.0.27 использует Commons DBCP 1.4) и выполняет замену имени пакета ( org.apache.commons -> org. apache.tomcat.dbcp ) и создает результат как tomcat-dbcp.jar . Это сделано для того, чтобы внутренние пулы Tomcat JDBC никогда не конфликтовали с возможным использованием приложениями классов Commons DBCP. Это позволяет избежать многих потенциальных проблем с загрузкой классов. Пакеты «dbcp» предназначены для управления источниками данных.

Точно так же механизм пула соединений Tomcat JDBC (org.apache.tomcat.jdbc.pool. *) Является альтернативной обновленной реализацией пула соединений с базой данных, которая конкурирует с Apache Commons DBCP. Это отдельный проект от Tomcat (Под модулями Tomcat -> jdbc-pool), но он дебютировал с Tomcat 7 (начиная с 7.0.19 в июле 2011 года). У обеих реализаций есть свои плюсы и минусы, однако DBCP Apache Commons все еще используется все шире.

В любом случае соответствующие JAR-файлы ( commons-dbcp.jar или tomcat-jdbc.jar ) должны быть включены в путь сборки.

В более старых версиях Apache Commons DBCP (то есть версии 1.2) возникали некоторые неприятные проблемы с безопасностью потоков в условиях высокой нагрузки, что делало его непригодным для такого использования, поэтому пул соединений JDBC Tomcat был переписан.

Использование Tomcat JDBC Connection Pool также очень просто, и для людей, которые уже знакомы с DBCP, переход довольно прост.

4. Пул соединений в приложении на основе Hibernate

Hibernate использует свое волшебство, чтобы определить, какого поставщика пула соединений использовать — на основе настроенных вами свойств.

Для c3p0 —

1
2
3
4
5
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">20</property>
<property name="hibernate.c3p0.timeout">300</property>
<property name="hibernate.c3p0.max_statements">50</property>
<property name="hibernate.c3p0.idle_test_period">3000</property>

Для Apache Commons DBCP —

1
2
3
4
<property name="hibernate.dbcp.initialSize">8</property>
<property name="hibernate.dbcp.maxActive">20</property>
<property name="hibernate.dbcp.maxIdle">20</property>
<property name="hibernate.dbcp.minIdle">0</property>

Соответствующий файл JAR должен находиться в каталоге lib вручную или с помощью Maven.

Мы также можем явно указать провайдера соединений с помощью свойства hibernate.connection.provider_class , хотя на самом деле это не нужно.

1
2
3
4
5
6
<property name="hibernate.connection.provider_class">org.hibernate.c3p0.internal.C3P0ConnectionProvider</property>
<property name="hibernate.c3p0.min_size">1</property>
<property name="hibernate.c3p0.max_size">19</property>
<property name="hibernate.c3p0.timeout">120</property>
<property name="hibernate.c3p0.max_statements">10</property>
<property name="hibernate.c3p0.idle_test_period">3000</property>

Если мы не настраиваем пул соединений с Hibernate, используется значение по умолчанию. Это видно в журнале или выводе консоли, когда мы запускаем приложение —

1
org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure

Реализация пула соединений по умолчанию в Hibernate НЕ подходит для производственного использования, в основном из-за ограничений конфигурации.

Если вы используете сервер приложений, вы можете использовать встроенный пул (обычно соединение получается с использованием JNDI).

Чтобы использовать встроенный пул сервера с Hibernate с использованием конфигурации JNDI, нам нужно установить следующее свойство в файл конфигурации Hibernate:

1
hibernate.connection.datasource=java:/comp/env/jdbc/TestDB

— предполагается, что TestDB — это имя JNDI источника данных пула соединений JDBC Tomcat (см. Фрагмент в разделе 2 выше).

Если вы не можете или не хотите использовать встроенный пул соединений сервера приложений, Hibernate поддерживает несколько других пулов соединений, таких как —

  1. c3p0
  2. Proxool

После Apache DBCP второй наиболее предпочтительной реализацией пула соединений является c3p0 , которая легко интегрируется с Hibernate и, как говорят, обеспечивает хорошую производительность.

5. Полезные ссылки

Как настроить пул соединений C3P0 в Hibernate

Ссылка: Понимание пулов соединений от нашего партнера JCG Абхиманью Прасада в блоге jCombat .