Пул підключень poolconnection

У загальному випадку пул об'єктів - це контейнер об'єктів, з якого можна отримати один з них на час. Використання пулу об'єктів є шаблонний спосіб вирішення проблеми зберігання і роздачі об'єктів у тимчасове користування.

Для розробки програми можна використовувати пули різного типу об'єктів, наприклад пул потоків Thread Pool. У даній статті розглядається тільки пул підключень Connection Pool до БД.

Пул підключень необхідний для WEB додатки, коли всі запити до бази даних стікаються в одне місце до сервера, а створення нового підключення до БД вимагає значних ресурсоов. Використання пулу підключення виправдано більш економною стратегією - створення кілька підключень і стеження за їхніх статків; в міру необхідності додавати нові.

Існує кілька реалізацій пулів підключень до БД. Можна, звичайно, зробити і свою імплементацію. Небезпека цієї затії полягає в тому, що якщо зробити не надто акуратно, то пул може "протікати" або об'єкти будуть "гаснути". Для серверної частини програми це особливо неприємно - необхідно контролювати обсяг пулу і стан об'єктів.

На сьогоднішній день існують готові рішення. Найголовніше навчитися їх правильно налаштовувати.

Пул підключень - apache commons dbcp, datasource

Популярний контейнер сервлетів Apache Tomcat надає власне рішення для створення dbcp. засноване на бібліотеці apache-commons-dbcp.

apache dbcp передбачає, що є деякий набір ( «пул») з'єднань до бази даних. Коли новий користувач запитує доступ до БД, йому видається вже відкрите з'єднання з цього пулу. Якщо все відкриті з'єднання вже зайняті, створюється нове. Як тільки користувач звільняє одне з уже існуючих з'єднань, воно стає доступно для інших користувачів. Якщо з'єднання довго не використовується, воно закривається.

Щоб реалізувати підтримку пулу підключень потрібно пройти кілька етапів.

На першому етапі необхідно оголосити ресурс (базу даних) в контексті програми. Ресурс описується наступним кодом (приклад для MySQL):

Контекст додатки представляє файл XML. Бажано зберігати його в .ocument_root% / META-INF / context.xml, однак це не єдиний варіант. Про контекст можна почитати на офіційному сайті Tomcat'a: The Context Container.

Далі слід додати посилання на цей ресурс в дескрипторі додатки web.xml:

Після цього можна використовувати пул підключень (connection pool java) в додатку. Для цього слід отримати об'єкт Connection в наступному коді:

Для отримання джерела даних (DataSource) використовується механізм JNDI (докладніше про нього можна почитати тут)

Опис пулу підключень завершено, підключення в додаток отримано, і тепер можна приступити до реалізації логіки роботи з БД - connection.createStatement (). Після виконання запиту слід закрити з'єднання (connection.close ()). Однак на відміну від звичайного з'єднання через драйвер JDBC, це з'єднання насправді не закриється: воно буде позначено в пулі як вільне, і його можна буде перевикористати пізніше.

Перед поверненням з'єднання в пул все Statement і ResultSet. отримані за допомогою цього з'єднання, автоматично закриваються відповідно до API.

Connection Pool C3P0

Пул підключень C3P0 представлений файлом c3p0-0.9.1.2.jar (версія може відрізнятися). Абревіатура розшифровується в такий спосіб. Connection Pool 3.0 => СP30 => C3P0.

Принцип налаштування JNDI ресурсів вже представлений вище. Необхідно визначити глобальні ресурси, а в WEB додатку вказати посилання, або можна вказати безпосередньо в context.xml. Все залежить від того, де зберігаються бібліотеки і яка конфігурація сервера.

Приклад настройки C3P0 з БД MySQL:

Тепер встановити пул підключень не вимагає особливого розуму. Основне завдання полягає в налагодженні його роботи, щоб він стабільно функціонував і витримував навантаження. Додатково про значення кожного параметри можна прочитати в документації:

  • maxPoolSize і minPoolSize - можливі максимальна і мінімальна кількість підключень в пулі
  • preferredTestQuery - запит який перевіряє підключення до БД. Залежить від конкретної СУБД.
  • acquireRetryAttempts - кількість спроб підключення до СУБД, якщо вона не доступна. Ставимо 0, якщо хочемо, щоб спроби не закінчувалися.
  • testConnectionOnCheckout - "ненажерливий", якщо можна, то краще не використовувати

Може виявитися, що jdbc Url включає символ амперсанда ''. Якщо настройка здійснюється через XML-файл, то треба замість param1 = value1param2 = value2 використовувати param1 = value1param2 = value2.

Завдання створення пулу підключень до Oracle не тривіальне. Документація приведена тут

Пул підключень на рівні java додатки, ComboPooledDataSource

Пул підключень C3P0 можна підключати не тільки на рівні контейнера додатків Tomcat, але і на рівні самого додатка. Для цього не потрібно створювати ніяких додаткових зовнішніх XML файлів, про які було сказано вище.

Наступний код демонструє процес створення і ініціалізації пулу підключень:

Наступний код демонструє як отримати Connection з пулу, і як його закрити (повернути в пул):