|
Установка правильного соединения с БД при проектировании WEB-приложения
|
|||
---|---|---|---|
#18+
Здравствуйте всем!!!! Есть такой вопрос: как правильно определить соединение с БД (в моём случае Oracle) при проектировании WEB-приложения (язык реализации Java)? Суть такова: как избежать DeadLocks. Делать ли один connection к БД на каждый отдельный пользовательский сеанс, и передавать его в сессии. Или в одном сеансе, в каждом классе, работающем с БД стоит делать свой екземпляр connection? И, если не сложно, подскажите вкратце, как Java вообще управляет SQL транзакциями. Большое спасибо за внимание!!! ;)))))))) ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2007, 12:13 |
|
Установка правильного соединения с БД при проектировании WEB-приложения
|
|||
---|---|---|---|
#18+
Смотри в сторону connection pools - встроенный (имеется в большинстве веб контейнеров и серверов приложений, если у тебя Томкат - DBCP) или отдельный (например c3p0). Во многих случаях стоит посмотреть и на Hibernate (ORM framework) - упрощает и стандартизует работу с БД, минимизирует число ошибок разработчиков при реализации стандартных операций доступа к данным. Если много бизнес-логики висит на Оракле - использование Хибернейт не всегда оправданно, если нет - рекомендую imho :) --- С уважением, Андрей SoftUnit project lead ... |
|||
:
Нравится:
Не нравится:
|
|||
22.01.2007, 16:43 |
|
Установка правильного соединения с БД при проектировании WEB-приложения
|
|||
---|---|---|---|
#18+
karlsonchik Суть такова: как избежать DeadLocks. 1. Установить единый порядок изменения записей БД для всех транзакций. 2. Работать с БД короткими системными транзакциями (тем более что речь идёт про Web). 3. Обработать взаимоблокировку и автоматически повторить транзакцию. 4. Странно, что взаимоблокировки стали проблемой. Я сними редко сталкиваюсь и то только в серверных приложениях, которые автоматически изменяют миллионы записей в сутки. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.01.2007, 17:20 |
|
Установка правильного соединения с БД при проектировании WEB-приложения
|
|||
---|---|---|---|
#18+
mcureenab karlsonchik Суть такова: как избежать DeadLocks. 3. Обработать взаимоблокировку и автоматически повторить транзакцию. тогда всречный вопрос )))) Каким образом можно обработать взаимо блокировку в Java???? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2007, 16:13 |
|
Установка правильного соединения с БД при проектировании WEB-приложения
|
|||
---|---|---|---|
#18+
Пулы уже использую... )))) Однако до сих пор применял их только внутри методов ((( Но знающие люди сказали, что правильно будет создавать один конект к БД на один клиентский сеанс, а потом передавать его в сессии, но при этом передавать голый конект, т.е. без всяких statements ... они должны создаваться и закрываться в каждом сервлете, например, отдельно. Следовательно пул следует создавать на более высоком уровне для пользовательского сеанса. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2007, 16:19 |
|
Установка правильного соединения с БД при проектировании WEB-приложения
|
|||
---|---|---|---|
#18+
karlsonchik mcureenab karlsonchik Суть такова: как избежать DeadLocks. 3. Обработать взаимоблокировку и автоматически повторить транзакцию. тогда всречный вопрос )))) Каким образом можно обработать взаимо блокировку в Java???? Если SQL запрос не может быть выполнен из-за взаимоблокировки, СУБД поднимает исключение в этом запросе. На стороне JVM драйвер доступа к БД это исключение может обернуть в исключение Java и тогда нужно его ловить в блоке обработки исключений, или просто вернуть код ошибки (для Java это экзотика), тогда нужно проверять этот код оператором if. Отменяешь транзакцию, увеличиваешь счётчик попыток и переходишь к началу процедуры. Или, если количество попыток исчерпано, поднимаешь исключение. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2007, 16:29 |
|
Установка правильного соединения с БД при проектировании WEB-приложения
|
|||
---|---|---|---|
#18+
Уважаемые господа.... Тут вот ещё один вопрос назрел )))))) как в Java отследить закрыта ли транзакция или нет. Вот, например, у меня есть хранимая процедура, которая заполняет временную таблицу. эта процедура повешена на кнопку... Пользователь нажимает на неё и ждёт пару сек... но если он не дождался и нажал кнопку ещё раз, то база виснет: очень вырастают ред-логи, рбс, КОРОЧЕ завал ))))) Так вот каким образом я могу в java проверить следующие моменты: отработала ли процедура или нет, произошёл ли комит(завершена ли транзакция) Я конечно решил эту траблу примитивно пока)))))) по онклик делаю кнопку desable.... но это не есть хороший выход ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2007, 16:31 |
|
Установка правильного соединения с БД при проектировании WEB-приложения
|
|||
---|---|---|---|
#18+
mcureenab На стороне JVM драйвер доступа к БД это исключение может обернуть в исключение Java и тогда нужно его ловить в блоке обработки исключений. Уважаемый, mcureenab!!! А можно про это по подробнее, если не затруднит... )))))) И вообще большущее спасибо что откликнулись )))))))) !!!!!! ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2007, 16:36 |
|
Установка правильного соединения с БД при проектировании WEB-приложения
|
|||
---|---|---|---|
#18+
karlsonchikУважаемые господа.... Тут вот ещё один вопрос назрел )))))) как в Java отследить закрыта ли транзакция или нет. Вот, например, у меня есть хранимая процедура, которая заполняет временную таблицу. эта процедура повешена на кнопку... Пользователь нажимает на неё и ждёт пару сек... но если он не дождался и нажал кнопку ещё раз, то база виснет: очень вырастают ред-логи, рбс, КОРОЧЕ завал ))))) Так вот каким образом я могу в java проверить следующие моменты: отработала ли процедура или нет, произошёл ли комит(завершена ли транзакция) Я конечно решил эту траблу примитивно пока)))))) по онклик делаю кнопку desable.... но это не есть хороший выход 1. а почему в процедуре не сделать оповещение об окончании (dbms_alert, dbms_pipe)? 2. disable для кнопки, на которую нажимать не нужно - вполне нормальное решение 3. как-то вопрос не для того форума... ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2007, 16:41 |
|
Установка правильного соединения с БД при проектировании WEB-приложения
|
|||
---|---|---|---|
#18+
karlsonchikДелать ли один connection к БД на каждый отдельный пользовательский сеанс, и передавать его в сессии. Или в одном сеансе, в каждом классе, работающем с БД стоит делать свой екземпляр connection? Не ясно, что ты понимаешь под "классом, работающем с БД". Если под каждый SQL запрос использовать отдельное подклчюние к БД, проблем будет очень много. И неразрешимые на уровне СУБД взаимоблокировки, и несогласованность данных. 1. Пусть у создан объект "сеанс пользователя", который живёт от момента регистрации пользователя в Web приложении, до выхода и хранит его состояние. Тогда "connection к БД" можно использовать несколькими способами. а. Создать в каждом сеансе пользователя свой "connection к БД". Этот подход позволит не завершать транзакцию БД между http запросами, но когда пользователей очень много, для хранения всех "connection к БД" потребуется много памяти как на в сервере приложений, так и в СУБД. Чаще используется другой подход. б. Создаёся пул "connection к БД" оптимального размера. В процессе выполнения http запроса "сеанс пользователя" находит в пуле свободный "connection к БД" и забирает его для выполнения всех своих запросов к БД (если в пуле нет свободных подключений, создаётся дополнительный "connection к БД"). Перед завершением обработки http запроса, "сеанс пользователя" завершает свою транзакцию БД и возвращает "connection к БД" в пул. Если пользователь работает с Web приложением не создавая сеанса, то нужно использовать модифицированный подход б. В процессе выполнения http запроса объект "http запрос" находит в пуле свободный "connection к БД" и забирает его для выполнения всех своих запросов к БД. Перед завершением обработки http запроса, "http запрос" завершает свою транзакцию БД и возвращает "connection к БД" в пул. Как правило работа с пулом подключений к БД скрыта от разработчика приложения. Требуется только соблюдать некоторые стандарты (например, всегда завершать транзакцию), и настроить сервер приложений. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2007, 16:56 |
|
Установка правильного соединения с БД при проектировании WEB-приложения
|
|||
---|---|---|---|
#18+
karlsonchikУважаемые господа.... Тут вот ещё один вопрос назрел )))))) как в Java отследить закрыта ли транзакция или нет. Вот, например, у меня есть хранимая процедура, которая заполняет временную таблицу. эта процедура повешена на кнопку... Пользователь нажимает на неё и ждёт пару сек... но если он не дождался и нажал кнопку ещё раз, то база виснет: очень вырастают ред-логи, рбс, КОРОЧЕ завал ))))) Так вот каким образом я могу в java проверить следующие моменты: отработала ли процедура или нет, произошёл ли комит(завершена ли транзакция) Я конечно решил эту траблу примитивно пока)))))) по онклик делаю кнопку desable.... но это не есть хороший выход Проще всего использовать синхронный вызов к БД. Пока хранимая процедура не завершится, нужно полностью блокировать форму для ввода. В любом случае в одном подключении к БД в каждый момент времени может выполняться не более одного запроса. Фиксировать транзакцию должно твоё приложение, иначе ты не сможешь обеспечить когерентность локального буфера записей с таблицами БД. Таким образом ты можешь отследить наличие активной транзакции в твоём приложении. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2007, 17:02 |
|
Установка правильного соединения с БД при проектировании WEB-приложения
|
|||
---|---|---|---|
#18+
karlsonchik mcureenab На стороне JVM драйвер доступа к БД это исключение может обернуть в исключение Java и тогда нужно его ловить в блоке обработки исключений. Уважаемый, mcureenab!!! А можно про это по подробнее, если не затруднит... )))))) И вообще большущее спасибо что откликнулись )))))))) !!!!!! Почитай про классы доступа к БД, про их методы выполнения SQL запросов и про исключения, которые они поднимают. Про обработку исключений Java написано в каждом букваре. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2007, 17:05 |
|
Установка правильного соединения с БД при проектировании WEB-приложения
|
|||
---|---|---|---|
#18+
karlsonchikКак правильно определить соединение с БД (в моём случае Oracle) при проектировании WEB-приложения (язык реализации Java)? Если действительно большая нагрузка и большие издержки на установку соединения - тогда пул соединений с БД, иначе - одно соединение на каждое выполнение серверной страницы. В любом случае, не надо забывать коммитить запросы в конце каждой серверной страницы. Проблема в том, что http не отслеживает состояния сессии. Интерпретатор на знает, когда заканчивается сессия, если ему явно об этом не сказать. Я когда-то учил сервер понимать, ушёл ли пользователь с сайта, применяя на клиенте JavaScript, но это ненадёжно. В результате если пользователь резко ушёл с сайта - запрос может остаться незакоммиченным, объекты БД - заблокированными, соединение - висящим в пустоте и кушающим ресурсы. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2007, 17:22 |
|
Установка правильного соединения с БД при проектировании WEB-приложения
|
|||
---|---|---|---|
#18+
AlexTheRavenЯ когда-то учил сервер понимать, ушёл ли пользователь с сайта, применяя на клиенте JavaScript, но это ненадёжно. В результате если пользователь резко ушёл с сайта - запрос может остаться незакоммиченным, объекты БД - заблокированными, соединение - висящим в пустоте и кушающим ресурсы. Замечание справедливо и для других приложений ориентированных на подключение. Watchdog далеко не сразу обнаруживает крах приложения, поэтому блокировки могут долго висеть. Пользователь может просто уйти на обед не завершив системную транзакцию. Хорошим тоном можно считать деление большой бизнес операции на ряд коротких системных транзакций, которые выполняются без прерываний на общение с пользователем и прочими ненадёжными узлами системы. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2007, 18:29 |
|
|
start [/forum/topic.php?fid=33&msg=34286088&tid=1549175]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
190ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
others: | 260ms |
total: | 542ms |
0 / 0 |