![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 13 Всего: 172 |
Ага. -------------------- |
|||
|
||||
| Slavca |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 17.2.2005 Где: Новосибирск Репутация: 1 Всего: 5 |
Один раз в жизни написать свой connection pool надо.
Таким образом ты сталкиваешься с проблемами, которые возникают по ходу решения и понимаешь идею. Легче дальше программировать будет. Главное - думать в правильном направлении. |
|||
|
||||
| Slavca |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 17.2.2005 Где: Новосибирск Репутация: 1 Всего: 5 |
Можно, например, так реализовать.
Правда за ошибками снаружи придется следить.
Извиняюсь. getInstance, естественно, должен быть static Это сообщение отредактировал(а) Slavca - 23.2.2005, 10:29 |
|||
|
||||
| batigoal |
|
|||
![]() Нелетучий Мыш ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6423 Регистрация: 28.12.2004 Где: Санктъ-Петербургъ Репутация: 16 Всего: 151 |
Slavca
Большое спасибо за пример, посмотрю на досуге. -------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли) ЖоржЖЖ |
|||
|
||||
| ZAVS |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 121 Регистрация: 25.2.2004 Где: ЕРЕВАН Репутация: нет Всего: 1 |
у resin-a тоже есть pool, можешь использовать
--------------------
Учись студент доцентом станешь :) |
|||
|
||||
| batigoal |
|
|||
![]() Нелетучий Мыш ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6423 Регистрация: 28.12.2004 Где: Санктъ-Петербургъ Репутация: 16 Всего: 151 |
ZAVS
Спасибо Мне пока не для реального использования, просто пощупать в свободное время. -------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли) ЖоржЖЖ |
|||
|
||||
| Fantasist |
|
|||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: нет Всего: 41 |
Написать надо, а на вот использовать на production не надо. Чтобы написать хороший пул надо очень хорошо разбираться в этом деле. Например в твоем сразу видно критический недостаток - все соеденения открывается сразу и к тому же сразу создается множество statements. Это сразу выделяет кучу ресурсов, которые чаще всего не будут использованны. Если у тебя, к примеру, три Tomcat'a на каждом по три сайта и каждый из них создает пул из 50 коннектов - то у тебя сразу создается 450 подключений, что уже может привести к тому, что все это дело рухнет. Говорят, что даже для того, чтобы поддерживать открытое соеденение MS SQL сервер выделяет около мегабайта памяти. Заодно скажу, что у нас общее количество сайтов работающих с одной и той же БД в три-четыре раза больше как минимум. -------------------- Волны гасят ветер... |
|||
|
||||
| Slavca |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 17.2.2005 Где: Новосибирск Репутация: 1 Всего: 5 |
Не могу не согласиться с тем, что для серьезных дел нужен серьезный подход.
|
|||
|
||||
| Stampede |
|
||||||
![]() Гносеолог ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 963 Регистрация: 25.4.2005 Где: Calgary, Alberta, Canada Репутация: 66 Всего: 144 |
Поскольку тред достаточно старый (я на Винграде появился спустя два месяца), то на глаза он мне раньше не попадался, а сегодня Lamer George дал на него ссылку в другом топике, ну и вот я значить из интереса зашел и глянул, о чем тут пишут.
Самое главный вывод: ТОВАРИЩИ, НЕ ПОЛЬЗУЙТЕСЬ ПРИМЕРОМ, который дал Slavca. Ни для каких целей: ни для продакшена, ни в качестве отправной точки при разработке собственного пула, ни как образец программного дизайна. Пример - просто из рук вон. Slavca, не обижайся. Молодец, что проявил инициативу и запостил код. Далее, ты совершенно справедливо говоришь, что "один раз в жизни написать свой connection pool надо". Действительно, надо. Дальше потом жить будет проще. Но надо также, чтобы нашелся человек, который прошелся бы по твоему коду с красным карандашом в руке и указал, чем плоха твоя самодельная реализация. Так вот, единственно с целью предостеречь возможных последователей от повторения твоих ошибок, беру в руки красный карандаш и начинаю править. Итак: 1. Зачем раздавать статементы вместо соединений??? Любой человек, который сталкивался с мало-мальски слоожными датабазными приложениями, знаком с понятием транзакции. Так вот, транзакция в теминах JDBC имеет область действия в пределах соединения, а не команды SQL! Из статемента, конечно, соединение тоже можно вытащить: statement.getConnection(), но зачем так делать, когда логически гораздо естественнее выдавать его прямо из пула? Кроме того, не все всегда делается статементом. Иногда полезнее использовать PreparedStatement, а иногда бывает нужен CallableStatement. 2. Привязка к приприеторному API Если ты в своей программе станешь использовать пул в таком виде, как ты его написал, то в каждом месте кода, где требуется доступ к БД, тебе придется писать примерно такое:
Если программист, который использует твой пул, забудет последнюю строчку, то рано или поздно массив забъется невозвращенными статементами, и больше никто никаких соединений получить не сможет. Причем это может произойти не только по причине забывчивости, но и в результате небрежного оформления кода доступа к данным, потому что по-грамотному строчка pool.getBack(stm) должна быть заключена в секции finally блока try/catch/finally. Но это касается датабазного кода вообще, и с этой точки зрения действия connection.close() и pool.getBack() предъявляют одинаковые требования к программистской дисциплине. А вот что действительно плохо, это что если ты на каком-то этапе решишь использовать другую реализацию пула, то тебе придется в куче мест убирать вызов pool.getBack(). Кстати, getBack - неудачное имя (get back - это возвращаться). Лучше было бы putBack или releaseStatement. Но это детали. Если ты спросишь, есть ли лучшие альтенрнативы, то ответ будет "Есть!". Для того чтобы сделать пул по возможности более прозрачным для программиста, можно, например, написать свою обертку (wrapper) вокруг объекта типа Connection, которая знает. что делать по close():
При таком подходе использование пула не накладывает никаких дополнительных требований на код доступа к данным, то есть можно использовать объекты типа Connection как обычное JDBC соединение. 3. Ранняя инициализация Как совершенно справедливо заметил Fantasist, во многих случаях это может завалить сервер - причем совершенно безо всяких на то оснований. С другой стороны, если разработчик уверен, что ранняя инициализация не будет проблемой в его приложении, он должен иметь возможность указать это при создании пула. 4. Отсутствие цикла ожидания А теперь - о самом главном недостатке. Как мы видим из кода, если свободных соединений нет, то пул просто и без затей возвращает нам значение null. Вот это зашибись! Нет бы чуток подождать, да попробовать еще разок, а он хоба - и null. Так вот, код по синхронизированию доступа к списку соединений - это и есть самая соль пула. Это именно то, ради чего как раз и было бы полезно попытаться написать пул самому. Потому что там вылезает куча нюансов взаимодействия тредов, которые просто необходимо знать всякому уважающему себя Java программеру. В данном случае код мог бы выглядеть примерно так (несущественные детали опускаем):
Вот так вот примерно. И это только самая минимально необходимая часть функциональности. Я уже не говорию о таких вещах как конфигурация, логирование, мониторинг и разблокирование подвисших соединений, корректная инициализация и закрытие, и т. д., и т. п. Поэтому. После того как вы напишите свою реализацию пула (можно взять за основу мои правки) и убедитесь, что она худо-бедно работает, нужно будет взять и все нафиг грохнуть, а потом пойти и взять нормальный готовый продукт. Например, такой как Proxool. И увидеть разницу. И настанет вам нирвана -------------------- "If you want something done right, do it yourself" По секрету: выучить английский - реально! |
||||||
|
|||||||
| DEMO_VERSION |
|
|||
|
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. |
|||
|
||||
| Се ля ви |
|
|||
![]() Java/SOAрхитектор ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2016 Регистрация: 5.6.2004 Где: place without tim e and space Репутация: 3 Всего: 127 |
Lamer George, если нужно, вот я недавно разбирался с проблемой доступа к пулу: http://forum.vingrad.ru/index.php?showtopi...=0entry502629
-------------------- |
|||
|
||||
| DEMOVERSION |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 105 Регистрация: 18.10.2005 Репутация: 1 Всего: 1 |
A chto naschet Apache DBCP? Kto-to polzovalsya???
I she est c3p0. |
|||
|
||||
| pvo |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 92 Регистрация: 7.10.2005 Где: Мск Репутация: 5 Всего: 7 |
Пользуюсь постоянно. Хорошая штука. |
|||
|
||||
| DEMOVERSION |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 105 Регистрация: 18.10.2005 Репутация: 1 Всего: 1 |
А можно пример?
|
|||
|
||||
| DEMOVERSION |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 105 Регистрация: 18.10.2005 Репутация: 1 Всего: 1 |
и если можно пример для простого приложения, а то я только примеры для веб-програм видел.
у меня простое консольное приложение. спасибо! |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |