Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Connection Pool 
:(
    Опции темы
batigoal
Дата 18.2.2005, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 16
Всего: 151



Уже несколько раз встречал советы типа "Используй для коннекта к БД connection pool". Объясните плиз, кратенько, с чем его едят, в чем выгода и, если можно, скелетную схему реализации.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
AntonSaburov
Дата 18.2.2005, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 8
Всего: 118



Основная идея connection pool состоит в том, что затраты на создание коннекта к базе достаточно ресурсоемкая операция и удобно иметь некоторое количество уже готовых коннектов к базе, которые пул выдает по требованию.

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

Если у пула нет свободных коннектов, то можно либо открывать еще конекты, либо просить клиента подождать.

Но чем интересен J2EE сервер - у него обычно есть свой собственный пул коннектов, который настраивается в конфигураторе. Там можно установить - сколько, к какому источнику данных и прочая. Само собой в этом случае не надо ничего писать - уже все есть. Используй на здоровье smile
PM MAIL WWW ICQ   Вверх
batigoal
Дата 18.2.2005, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 16
Всего: 151



Тогда такой вопрос: J2EE сервер - это ведь не то же самое, что веб-сервер? Скажем, Томкат - имеет пул соединений?

И можно еще какую-нибудь ссылочку, чтоб больше не отвлекать smile


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
AntonSaburov
Дата 18.2.2005, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 8
Всего: 118



Ну это сильно зависит от сервера. Вот наример для JBoss можно посмотреть Connection Pool Configuration Examples and Driver Notes
PM MAIL WWW ICQ   Вверх
batigoal
Дата 18.2.2005, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 16
Всего: 151



Пасиба. Я, правда, с JBoss'ом никогда не работал, но ведь надо когда-то и начинать smile


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
Guest
Дата 19.2.2005, 16:17 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата(Lamer @ 18.2.2005, 17:31)
Тогда такой вопрос: J2EE сервер - это ведь не то же самое, что веб-сервер? Скажем, Томкат - имеет пул соединений?

И можно еще какую-нибудь ссылочку, чтоб больше не отвлекать  smile

пулл соединений он имеет, как и пул тхреадов.
НО! ты спрашивал про пулл соединений с БД - тут тебе никто не поможет - делай сам. Правда в JDBC для FireBird уже к примеру что-то реализовано.
Но на практике - этот самый пулл коннектов к БД делается за 15-30мин. _свой_ ... так что лучше свой smile.

Sleepy_PIP
  Вверх
batigoal
Дата 19.2.2005, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 16
Всего: 151



Цитата(Guest @ 19.2.2005, 16:17)
Но на практике - этот самый пулл коннектов к БД делается за 15-30мин. _свой_ ... так что лучше свой

Это если уже умеешь... А если нет - то несколько дней...


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
Domestic Cat
Дата 19.2.2005, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 13
Всего: 172



Цитата(Guest @ 19.2.2005, 07:17)
Но на практике - этот самый пулл коннектов к БД делается за 15-30мин. _свой_ ... так что лучше свой smile.


Есть хороший принцип - NIH (Not Invented Here). Суть его в том, что в 99,9999% случаев написанная тобой за 15-30 минут примочка будет хуже, чем аналогичная, но написанная специалистами, оттестированная тысячами пользователей.

http://db.apache.org/torque/index.html


--------------------

PM   Вверх
Guest
Дата 20.2.2005, 17:25 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата(Domestic @ 19.2.2005, 20:05)
Цитата(Guest @ 19.2.2005, 07:17)
Но на практике - этот самый пулл коннектов к БД делается за 15-30мин. _свой_ ... так что лучше свой smile.


Есть хороший принцип - NIH (Not Invented Here). Суть его в том, что в 99,9999% случаев написанная тобой за 15-30 минут примочка будет хуже, чем аналогичная, но написанная специалистами, оттестированная тысячами пользователей.

http://db.apache.org/torque/index.html

извини, но тогда надо сравнивать время разработки своей примочки с суммой времен - на: 1. поиск чужей примочки+2. освоение чужей примочки+3.тестирование чужей примочки+4. обход багов чужой примочки (хорошо если она с сорцами!).
Так что вопрос для программера - в балансировании между временем разработки своего варианта решения, или временем на применение чъего-то другого решения.
Мое решение (собственное) пережило 2 серевера БД. А вот найти и разобраться с аналогичным за 30 мин. мне не удалось тем более что речь идет и правда о малых трудозатратах.

Как яркий пример могу привести common-net - я взял ее для работы с FTP. и затратил довольно много времени для разбирателвств с нею, и переделки ее под понимание русских букв.
В ведь common-net используют наверняка тысячи пользователей!.
Аналогично повторяется с ADF-Faces - я уже как несколько мес. (вечерами) тестирую эту библиотеку, постоянно нарываясь на баги ... ну и что теперь? Но сесть и писать свою - я не в состоянии ... т.е. вот конкретный пример выбора между суммой времен ... и так везде.
ну разве не так? smile




  Вверх
Sleepy_PIP
Дата 20.2.2005, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 512
Регистрация: 30.6.2004
Где: Moscow

Репутация: 2
Всего: 12



Цитата(Guest @ 20.2.2005, 17:25)
Цитата(Domestic @ 19.2.2005, 20:05)
Цитата(Guest @ 19.2.2005, )
Но на практике - этот самый пулл коннектов к БД делается за 15-30мин. _свой_ ... так что лучше свой smile.


Есть хороший принцип - NIH (Not Invented Here). Суть его в том, что в 99,9999% случаев написанная тобой за 15-30 минут примочка будет хуже, чем аналогичная, но написанная специалистами, оттестированная тысячами пользователей.

http://db.apache.org/torque/index.html

извини, но тогда надо сравнивать время разработки своей примочки с суммой времен - на: 1. поиск чужей примочки+2. освоение чужей примочки+3.тестирование чужей примочки+4. обход багов чужой примочки (хорошо если она с сорцами!).

ООО! Пардон. не заметил что у меня рецепты сбросились smile ... Приношу извинений - посл. письмо - от меня ...


--------------------
--
Sleepy_PIP. Pavel Pryazhentsev (ex. 2:5020/141) "... Лучше быть нужным, чем
свободным ..."
PM MAIL ICQ   Вверх
Domestic Cat
Дата 20.2.2005, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 13
Всего: 172



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


--------------------

PM   Вверх
Sleepy_PIP
Дата 20.2.2005, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 512
Регистрация: 30.6.2004
Где: Moscow

Репутация: 2
Всего: 12



Цитата(Domestic @ 20.2.2005, 19:59)
Если речь о небольшом приложении и единичной потребности, то да. Но по большому счету я не соглашусь. Ты ведь пользуешь например ArrayList? Самому его легко написать, но если туда попадет баг - потратишь время.
Тот же коннекшн пул - даже простейший вариант означает многопоточность. Сделаешь маленький недосмотр, оттестишь - работает. А в рабочих условиях все накрывается медным тазиком при большом числе коннекшнов. Тут проще потратить 1 день и разобраться с чужим приложениием, чем потом мучаться неделю на выслеживание трудноуловимого бага. smile

ну вот в Опен соурс разборки в 1 день - малы. надо как я и писал - найти, разобраться ( и ВЫБРАТЬ!), попатсть на баги и научиться их обходить ... для данной, пприведенной задачи - это не стоит так делать, согласись!



--------------------
--
Sleepy_PIP. Pavel Pryazhentsev (ex. 2:5020/141) "... Лучше быть нужным, чем
свободным ..."
PM MAIL ICQ   Вверх
Domestic Cat
Дата 20.2.2005, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 13
Всего: 172



Цитата(Sleepy_PIP @ 20.2.2005, 11:18)
ну вот в Опен соурс разборки в 1 день - малы. надо как я и писал - найти, разобраться ( и ВЫБРАТЬ!), попатсть на баги и научиться их обходить ... для данной, пприведенной задачи - это не стоит так делать, согласись!


Зато, потратив время на Стратс, коммонс и т п, потом легче и проще писать.


--------------------

PM   Вверх
batigoal
Дата 20.2.2005, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 16
Всего: 151



Пардон, это опять я вклиниваюсь в беседу умных людей. "Коммонс" - это библиотеки common-net и еще несколько common-что-то, да?


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
LSD
Дата 20.2.2005, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 5
Всего: 538



Лучше использовать общепризнанные технологии. Они лучше оттестированны, обеспечивают большую гибкость и универсальность.
Да, тот код который ты напишешь, будет подходить под твои условия лучше, но по мере развития проекта и он будет требовать постоянной переделки, его нельзя будет использовать в другом проекте.
Цитата
Лучше день потерять, потом за 5 минут долететь!



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Domestic Cat
Дата 20.2.2005, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 13
Всего: 172



Цитата(Lamer @ 20.2.2005, 13:09)
"Коммонс" - это библиотеки common-net и еще несколько common-что-то, да?


Ага.


--------------------

PM   Вверх
Slavca
Дата 21.2.2005, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 17.2.2005
Где: Новосибирск

Репутация: 1
Всего: 5



Один раз в жизни написать свой connection pool надо.
Таким образом ты сталкиваешься с проблемами, которые возникают
по ходу решения и понимаешь идею.
Легче дальше программировать будет.
Главное - думать в правильном направлении.
PM ICQ   Вверх
Slavca
Дата 22.2.2005, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 17.2.2005
Где: Новосибирск

Репутация: 1
Всего: 5



Можно, например, так реализовать.
Правда за ошибками снаружи придется следить.
Код

import java.sql.Connection;
import java.sql.Statement;
import java.sql.DriverManager;
import java.sql.SQLException;

/**
* Название говорит само за себя.
*/
final class ConnectionPool {
   private Connection[] c;//массив подключений
   private Statement[] s;//массив утверждений
   private boolean[] b;//флаги занятости утверждений
   private int size;//размер масиивов
   //переменные чтоб в методах не создавать
   private int i;//индекс массивов
//----Конструктор-------------------------------------------------------
   private ConnectionPool(String driver, String url, String user,
                          String password, int _size)
           throws ClassNotFoundException, SQLException {
       size=_size;
       c=new Connection[size];
       s=new Statement[size];
       b=new boolean[size];
       Class.forName(driver);
       int i;
       for(i=0;i<size;i++){
           c[i]=DriverManager.getConnection(url,user,password);
           s[i]=c[i].createStatement();
           b[i]=false;
       }
   }
//----Метод создания объекта--------------------------------------------
   final static ConnectionPool getInstance(String driver, String url,
                                    String user, String password,
                                    int size){
       try{
           Class.forName(driver);
       }catch(ClassNotFoundException e1){
           return null;
       }
       try{
           Connection c=DriverManager.getConnection(url,user,password);
           Statement s=c.createStatement();
           s.close();
           c.close();
       }catch(SQLException e2){
           return null;
       }
       try{
           ConnectionPool cp=new ConnectionPool(driver, url, user,
                   password, size);
           return cp;
       }catch(ClassNotFoundException e1){
           return null;
       }catch(SQLException e2){
           return null;
       }
   }
//----Метод захвата утверждения-----------------------------------------
   final synchronized Statement getStatement(){
       for(i=0;i<size;i++){
           if(!b[i]){
               b[i]=true;
               return s[i];
           }
       }
       return null;
   }
//----Метод освобождения утверждения------------------------------------
   final synchronized boolean getBack(Statement _s){
       for(i=0;i<size;i++){
           if(s[i]==_s){
               b[i]=false;
               return true;
           }
       }
       return false;
   }
//----Метод для закрытия пула-------------------------------------------
   final synchronized boolean close(){
       //если ресурс занят - то не заканчиваем работу
       for(i=0;i<size;i++){
           if(b[i]){
               return false;
           }
       }
       boolean error=false;
       //закрываем подключения и утверждения
       for(i=0;i<size;i++){
           try{
               s[i].close();
           }catch(SQLException e1){
               error=true;
           }
           try{
               c[i].close();
           }catch(SQLException e2){
               error=true;
           }
       }
       return !error;
   }
}


Извиняюсь. getInstance, естественно, должен быть static

Это сообщение отредактировал(а) Slavca - 23.2.2005, 10:29
PM ICQ   Вверх
batigoal
Дата 22.2.2005, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 16
Всего: 151



Slavca
Большое спасибо за пример, посмотрю на досуге.



--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
ZAVS
Дата 25.2.2005, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 25.2.2004
Где: ЕРЕВАН

Репутация: нет
Всего: 1



у resin-a тоже есть pool, можешь использовать
--------------------
Учись студент доцентом станешь :)
PM MAIL ICQ   Вверх
batigoal
Дата 25.2.2005, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 16
Всего: 151



ZAVS
Спасибо
Мне пока не для реального использования, просто пощупать в свободное время.



--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
Fantasist
Дата 28.2.2005, 02:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: нет
Всего: 41



Цитата(Slavca @ 21.2.2005, 09:27)
Один раз в жизни написать свой connection pool надо.


Написать надо, а на вот использовать на production не надо. Чтобы написать хороший пул надо очень хорошо разбираться в этом деле. Например в твоем сразу видно критический недостаток - все соеденения открывается сразу и к тому же сразу создается множество statements. Это сразу выделяет кучу ресурсов, которые чаще всего не будут использованны. Если у тебя, к примеру, три Tomcat'a на каждом по три сайта и каждый из них создает пул из 50 коннектов - то у тебя сразу создается 450 подключений, что уже может привести к тому, что все это дело рухнет. Говорят, что даже для того, чтобы поддерживать открытое соеденение MS SQL сервер выделяет около мегабайта памяти. Заодно скажу, что у нас общее количество сайтов работающих с одной и той же БД в три-четыре раза больше как минимум.




--------------------
Волны гасят ветер...
PM MAIL   Вверх
Slavca
Дата 28.2.2005, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 17.2.2005
Где: Новосибирск

Репутация: 1
Всего: 5



Не могу не согласиться с тем, что для серьезных дел нужен серьезный подход.
PM ICQ   Вверх
Stampede
Дата 17.10.2005, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

Репутация: 66
Всего: 144



Поскольку тред достаточно старый (я на Винграде появился спустя два месяца), то на глаза он мне раньше не попадался, а сегодня Lamer George дал на него ссылку в другом топике, ну и вот я значить из интереса зашел и глянул, о чем тут пишут.

Самое главный вывод: ТОВАРИЩИ, НЕ ПОЛЬЗУЙТЕСЬ ПРИМЕРОМ, который дал Slavca. Ни для каких целей: ни для продакшена, ни в качестве отправной точки при разработке собственного пула, ни как образец программного дизайна. Пример - просто из рук вон.

Slavca, не обижайся. Молодец, что проявил инициативу и запостил код. Далее, ты совершенно справедливо говоришь, что "один раз в жизни написать свой connection pool надо". Действительно, надо. Дальше потом жить будет проще. Но надо также, чтобы нашелся человек, который прошелся бы по твоему коду с красным карандашом в руке и указал, чем плоха твоя самодельная реализация.

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

1. Зачем раздавать статементы вместо соединений???

Любой человек, который сталкивался с мало-мальски слоожными датабазными приложениями, знаком с понятием транзакции. Так вот, транзакция в теминах JDBC имеет область действия в пределах соединения, а не команды SQL! Из статемента, конечно, соединение тоже можно вытащить: statement.getConnection(), но зачем так делать, когда логически гораздо естественнее выдавать его прямо из пула?

Кроме того, не все всегда делается статементом. Иногда полезнее использовать PreparedStatement, а иногда бывает нужен CallableStatement.

2. Привязка к приприеторному API

Если ты в своей программе станешь использовать пул в таком виде, как ты его написал, то в каждом месте кода, где требуется доступ к БД, тебе придется писать примерно такое:

Код

ConnectionPool pool = ConnectionPool.getInstance("connection params...");
Statement stm = pool.getStatement(stm);
int n = stm.executeQuery("update some_table set some_field=10 where some_id="25"");
stm.close();

// важно!
stm.getConnection().close();
pool.getBack(stm);


Если программист, который использует твой пул, забудет последнюю строчку, то рано или поздно массив забъется невозвращенными статементами, и больше никто никаких соединений получить не сможет. Причем это может произойти не только по причине забывчивости, но и в результате небрежного оформления кода доступа к данным, потому что по-грамотному строчка pool.getBack(stm) должна быть заключена в секции finally блока try/catch/finally.

Но это касается датабазного кода вообще, и с этой точки зрения действия connection.close() и pool.getBack() предъявляют одинаковые требования к программистской дисциплине. А вот что действительно плохо, это что если ты на каком-то этапе решишь использовать другую реализацию пула, то тебе придется в куче мест убирать вызов pool.getBack(). Кстати, getBack - неудачное имя (get back - это возвращаться). Лучше было бы putBack или releaseStatement. Но это детали.

Если ты спросишь, есть ли лучшие альтенрнативы, то ответ будет "Есть!". Для того чтобы сделать пул по возможности более прозрачным для программиста, можно, например, написать свою обертку (wrapper) вокруг объекта типа Connection, которая знает. что делать по close():

Код

public class ConnectionWrapper implements Connection
{
  private ConnectionPool pool;
  private Connection con;

  public ConnectionWrapper(Connection con, Connection Pool pool)
  {
    this.pool = pool;
    this.con = con;
  }

  // delegate all methods on the Connection interface
  //  to the underlyong Connection object
  public Statement createStatement() throws SQLException
  {
    return con.createStatement();
  }

// ...and so on

  public void close() throws SQLException
  {
    con.close();
    pool.releaseConnection(con);
  }
}


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

3. Ранняя инициализация

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

4. Отсутствие цикла ожидания

А теперь - о самом главном недостатке. Как мы видим из кода, если свободных соединений нет, то пул просто и без затей возвращает нам значение null. Вот это зашибись! Нет бы чуток подождать, да попробовать еще разок, а он хоба - и null.

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

В данном случае код мог бы выглядеть примерно так (несущественные детали опускаем):

Код

public synchronized Connection getConnection() throws SQLException
{
  try
  {
    while(true)
    {
      ConnectionWrapper con = getAvailableConnection();
      if (con != null)
      {
        return con;
      }
      // all connections are busy
      if (list.size() < MAX_CONNECTIONS)
      {
        return createNewConnection();
      }
      // otherwise wait till one gets available
      wait();
    }
  }
  catch (InterruptedException e)
  {
    // not much else to do here
    logger.error(e.getMessage(), e);
    throw new RuntimeException("Could not allocate an SQL connection");
  }
}

public synchronized Connection releaseConnection(ConnectionWrapper con)
{
  con.setAvailable();
  notifyAll(); // Это самая важная часть: разблокировать все ждущие треды
               //  и позволить им конкурировать за захват objectMonitor'а

}

private ConnectionWrapper getAvailableConnection()
{
    Iterator iter = list.iterator();
    while (iter.hasNext())
    {
      ConnectionWrapper con = iter.next();
      if (con.isAvailable())
      {
        con.setBusy();
        return con;
      }
    }

    return null;
}


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

Поэтому. После того как вы напишите свою реализацию пула (можно взять за основу мои правки) и убедитесь, что она худо-бедно работает, нужно будет взять и все нафиг грохнуть, а потом пойти и взять нормальный готовый продукт. Например, такой как Proxool. И увидеть разницу.

И настанет вам нирвана smile



--------------------
"If you want something done right, do it yourself"
По секрету: выучить английский - реально!
PM WWW   Вверх
DEMO_VERSION
Дата 18.10.2005, 11:02 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Ya posmotrel na Proxool, vrode klasnoya shtyka, vse prosto. No kak etim polzovatsya v realnom prilozenii???

Esli y mne nado vupolnit SQL zapros kakoj kod mne nado napisat'????

Sejchas v moej programe odin Connection katoruj sozdaetsya pri starte programu. Potim kogda ya hocy zapystit' Statemement, PreparedStatement ya dostau Connection(y menya on tolko odin), delau
connection.createStatement(....) i poehali.

Chto mne pomenyat???
Mozhet est eshe primeru ili mozhet est svoii primeru??

Spasibo.

  Вверх
Се ля ви
Дата 18.10.2005, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java/SOAрхитектор
****


Профиль
Группа: Модератор
Сообщений: 2016
Регистрация: 5.6.2004
Где: place without tim e and space

Репутация: 3
Всего: 127



Lamer George, если нужно, вот я недавно разбирался с проблемой доступа к пулу: http://forum.vingrad.ru/index.php?showtopi...=0&#entry502629


--------------------
  )
 (
[_])
проф. блог

Кролики думали, что занимаются любовью, а на самом деле их просто разводили...
PM MAIL WWW Skype GTalk   Вверх
DEMOVERSION
Дата 18.10.2005, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 18.10.2005

Репутация: 1
Всего: 1



A chto naschet Apache DBCP? Kto-to polzovalsya???
I she est c3p0.
PM MAIL   Вверх
pvo
Дата 18.10.2005, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 7.10.2005
Где: Мск

Репутация: 5
Всего: 7



Цитата(DEMOVERSION @ 18.10.2005, 12:43)
A chto naschet Apache DBCP? Kto-to polzovalsya???

Пользуюсь постоянно. Хорошая штука.
PM MAIL ICQ   Вверх
DEMOVERSION
Дата 18.10.2005, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 18.10.2005

Репутация: 1
Всего: 1



А можно пример?
PM MAIL   Вверх
DEMOVERSION
Дата 18.10.2005, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 18.10.2005

Репутация: 1
Всего: 1



и если можно пример для простого приложения, а то я только примеры для веб-програм видел.
у меня простое консольное приложение.

спасибо!
PM MAIL   Вверх
pvo
Дата 18.10.2005, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 7.10.2005
Где: Мск

Репутация: 5
Всего: 7



Цитата(DEMOVERSION @ 18.10.2005, 15:16)
А можно пример?

У меня он работает через Apache Torque или Hibernate. Соответственно, прямых обращений к dbcp у меня нет.

Вот ссылка на примеры, идущие с dbcp: Тынц

PM MAIL ICQ   Вверх
Shatl
Дата 19.11.2005, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 8.9.2005
Где: Belarus, Жодино

Репутация: нет
Всего: нет



Род Джонсон в своей статье о Spring Framework пишет (см.полный текст)

Цитата
Главная цель Spring – упростить использование J2EE и способствовать хорошему программированию.

Spring не рассчитан на повторное изобретение колеса. Поэтому вы не найдете в Spring пакетов для ведения логов, пулов подключений, или координаторов распределенных транзакций. Все это либо можно найти в open source-проектах (например, Commons Logging, который мы вовсю используем для логирования, или Commons DBCP), ...

PM MAIL   Вверх
VSergeyV
Дата 20.9.2006, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 299
Регистрация: 9.5.2006
Где: Новосибирск

Репутация: нет
Всего: 3



Как правильно и эффективно использовать DBCP?
Tomcat+Sybase 12.5
Запустил соответствующие примеры к DBCP все работает, а как правильно использовать DBCP в реальных приложениях?
Есть web-проект/который был сделан без фраймворков/, c JSP, сервлетами и Java классами в которую вынесена логика.
Допустим необходимо при вызове JSP страницы выполнять соответствующий запрос к БД
В классе реализуещем логику вставки в таблицу необходимо вызвать метод класса который предоставляет сервисные возможности для работы с DBCP /я так понимаю/, как должен выглядеть этот самый класс, реализующий логику работы с DBCP? Он будет похож на приводимые в примерах (http://svn.apache.org/viewvc/jakarta/commons/proper/dbcp/trunk/doc/) на DBCP классы:
  • BasicDataSourceExample.java 
  • JOCLPoolingDriverExample.java
  • ManualPoolingDataSourceExample.java 
  • ManualPoolingDriverExample.java
Кстати, про то что эти примеры разливаются способом установки свойств я понял, а про остальное еще не совсем...
Какой из этих примеров взять за базовый?
PM MAIL ICQ   Вверх
tux
Дата 20.9.2006, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 74
Всего: 132



В BasicDataSourceExample.java пример того, как работать со стандартным источником данных DBCP, внутри которого и реализован пул соединений. Остальное - примеры использования источников данных DBCP, которые используют свойство драйвера JDBC самостоятельно создавать пул соединений. Обычно используют BasicDataSource, тогда не зависишь от того реализует драйвер свой пул или нет. Но в твоем случае если СУБД точно не поменяется, то фиолетово, все у Sybase реализовано.

Добавлено @ 11:01 
Кстати, в Tomcat есть connection pool, реализованный на DBCP. Почему его не используешь? Тогда тебе все, что нужно будет - это получить DataSource из JNDI.

Это сообщение отредактировал(а) tux - 20.9.2006, 11:02
PM MAIL Skype GTalk Jabber YIM   Вверх
VSergeyV
Дата 20.9.2006, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 299
Регистрация: 9.5.2006
Где: Новосибирск

Репутация: нет
Всего: 3



Цитата

все у Sybase реализовано

Т.е. у коннектора к нему? У нас используется Sybase 12.5, и коннектор к нему/ весьма не свежий/ как бы мне этот проект достался "по наследству". Старый программист реализовывал свой "самодельный" конекшин пулл к БД, он им был сам не доволен...

Цитата

Кстати, в Tomcat есть connection pool, реализованный на DBCP. Почему его не используешь?

Слышал, вот хотел бы уточнить что это, и как его использовать, у нас Томкат (5.5.12)

Цитата

реализованный на DBCP

Т.е. уже используется либы DBCP??? И по идеи их не надо ставить?

Цитата

Тогда тебе все, что нужно будет - это получить DataSource из JNDI

Т.е. почти как в примере BasicDataSourceExample.java?




Это сообщение отредактировал(а) VSergeyV - 20.9.2006, 11:22
PM MAIL ICQ   Вверх
tux
Дата 20.9.2006, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 74
Всего: 132



Цитата(VSergeyV @  20.9.2006,  16:19 Найти цитируемый пост)
Т.е. у коннектора к нему? У нас используется Sybase 12.5, и коннектор к нему/ весьма не свежий/ как бы мне этот проект достался "по наследству".

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

Цитата(VSergeyV @  20.9.2006,  16:19 Найти цитируемый пост)
Слышал, вот хотел бы уточнить что это, и как его использовать, у нас Томкат (5.12)

Вот здесь готовый рецепт, только для MySQL - http://forum.vingrad.ru/index.php?showtopi...st&p=660286.

Цитата(VSergeyV @  20.9.2006,  16:19 Найти цитируемый пост)
Т.е. уже используется либы DBCP??? И по идеи их не надо ставить?

Нет, не надо, все уже есть.

Цитата(VSergeyV @  20.9.2006,  16:19 Найти цитируемый пост)
Т.е. почти как в примере BasicDataSourceExample.java?

Пример - по ссылке.
PM MAIL Skype GTalk Jabber YIM   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.1678 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.