Гость
Форумы / Разработка информационных систем [игнор отключен] [закрыт для гостей] / Установка правильного соединения с БД при проектировании WEB-приложения / 14 сообщений из 14, страница 1 из 1
19.01.2007, 12:13
    #34267629
karlsonchik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Установка правильного соединения с БД при проектировании WEB-приложения
Здравствуйте всем!!!!

Есть такой вопрос: как правильно определить соединение с БД (в моём случае Oracle) при проектировании WEB-приложения (язык реализации Java)?
Суть такова: как избежать DeadLocks.
Делать ли один connection к БД на каждый отдельный пользовательский сеанс, и передавать его в сессии. Или в одном сеансе, в каждом классе, работающем с БД стоит делать свой екземпляр connection?
И, если не сложно, подскажите вкратце, как Java вообще управляет SQL транзакциями.

Большое спасибо за внимание!!! ;))))))))
...
Рейтинг: 0 / 0
22.01.2007, 16:43
    #34272875
Andrew Bykov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Установка правильного соединения с БД при проектировании WEB-приложения
Смотри в сторону connection pools - встроенный (имеется в большинстве веб контейнеров и серверов приложений, если у тебя Томкат - DBCP) или отдельный (например c3p0).

Во многих случаях стоит посмотреть и на Hibernate (ORM framework) - упрощает и стандартизует работу с БД, минимизирует число ошибок разработчиков при реализации стандартных операций доступа к данным.

Если много бизнес-логики висит на Оракле - использование Хибернейт не всегда оправданно, если нет - рекомендую
imho :)

---
С уважением, Андрей
SoftUnit project lead
...
Рейтинг: 0 / 0
22.01.2007, 17:20
    #34273011
mcureenab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Установка правильного соединения с БД при проектировании WEB-приложения
karlsonchik
Суть такова: как избежать DeadLocks.


1. Установить единый порядок изменения записей БД для всех транзакций.
2. Работать с БД короткими системными транзакциями (тем более что речь идёт про Web).
3. Обработать взаимоблокировку и автоматически повторить транзакцию.
4. Странно, что взаимоблокировки стали проблемой. Я сними редко сталкиваюсь и то только в серверных приложениях, которые автоматически изменяют миллионы записей в сутки.
...
Рейтинг: 0 / 0
26.01.2007, 16:13
    #34285938
karlsonchik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Установка правильного соединения с БД при проектировании WEB-приложения
mcureenab karlsonchik
Суть такова: как избежать DeadLocks.


3. Обработать взаимоблокировку и автоматически повторить транзакцию.

тогда всречный вопрос )))) Каким образом можно обработать взаимо блокировку в Java????
...
Рейтинг: 0 / 0
26.01.2007, 16:19
    #34285972
karlsonchik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Установка правильного соединения с БД при проектировании WEB-приложения
Пулы уже использую... )))) Однако до сих пор применял их только внутри методов ((( Но знающие люди сказали, что правильно будет создавать один конект к БД на один клиентский сеанс, а потом передавать его в сессии, но при этом передавать голый конект, т.е. без всяких statements ... они должны создаваться и закрываться в каждом сервлете, например, отдельно.
Следовательно пул следует создавать на более высоком уровне для пользовательского сеанса.
...
Рейтинг: 0 / 0
26.01.2007, 16:29
    #34286035
mcureenab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Установка правильного соединения с БД при проектировании WEB-приложения
karlsonchik mcureenab karlsonchik
Суть такова: как избежать DeadLocks.


3. Обработать взаимоблокировку и автоматически повторить транзакцию.

тогда всречный вопрос )))) Каким образом можно обработать взаимо блокировку в Java????

Если SQL запрос не может быть выполнен из-за взаимоблокировки, СУБД поднимает исключение в этом запросе.
На стороне JVM драйвер доступа к БД это исключение может обернуть в исключение Java и тогда нужно его ловить в блоке обработки исключений, или просто вернуть код ошибки (для Java это экзотика), тогда нужно проверять этот код оператором if.
Отменяешь транзакцию, увеличиваешь счётчик попыток и переходишь к началу процедуры.
Или, если количество попыток исчерпано, поднимаешь исключение.
...
Рейтинг: 0 / 0
26.01.2007, 16:31
    #34286055
karlsonchik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Установка правильного соединения с БД при проектировании WEB-приложения
Уважаемые господа.... Тут вот ещё один вопрос назрел )))))) как в Java отследить закрыта ли транзакция или нет. Вот, например, у меня есть хранимая процедура, которая заполняет временную таблицу. эта процедура повешена на кнопку... Пользователь нажимает на неё и ждёт пару сек... но если он не дождался и нажал кнопку ещё раз, то база виснет: очень вырастают ред-логи, рбс, КОРОЧЕ завал ))))) Так вот каким образом я могу в java проверить следующие моменты: отработала ли процедура или нет, произошёл ли комит(завершена ли транзакция)

Я конечно решил эту траблу примитивно пока)))))) по онклик делаю кнопку desable.... но это не есть хороший выход
...
Рейтинг: 0 / 0
26.01.2007, 16:36
    #34286088
karlsonchik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Установка правильного соединения с БД при проектировании WEB-приложения
mcureenab
На стороне JVM драйвер доступа к БД это исключение может обернуть в исключение Java и тогда нужно его ловить в блоке обработки исключений.

Уважаемый, mcureenab!!! А можно про это по подробнее, если не затруднит... ))))))
И вообще большущее спасибо что откликнулись )))))))) !!!!!!
...
Рейтинг: 0 / 0
26.01.2007, 16:41
    #34286117
tru55
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Установка правильного соединения с БД при проектировании WEB-приложения
karlsonchikУважаемые господа.... Тут вот ещё один вопрос назрел )))))) как в Java отследить закрыта ли транзакция или нет. Вот, например, у меня есть хранимая процедура, которая заполняет временную таблицу. эта процедура повешена на кнопку... Пользователь нажимает на неё и ждёт пару сек... но если он не дождался и нажал кнопку ещё раз, то база виснет: очень вырастают ред-логи, рбс, КОРОЧЕ завал ))))) Так вот каким образом я могу в java проверить следующие моменты: отработала ли процедура или нет, произошёл ли комит(завершена ли транзакция)

Я конечно решил эту траблу примитивно пока)))))) по онклик делаю кнопку desable.... но это не есть хороший выход

1. а почему в процедуре не сделать оповещение об окончании (dbms_alert, dbms_pipe)?
2. disable для кнопки, на которую нажимать не нужно - вполне нормальное решение
3. как-то вопрос не для того форума...
...
Рейтинг: 0 / 0
26.01.2007, 16:56
    #34286195
mcureenab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Установка правильного соединения с БД при проектировании WEB-приложения
karlsonchikДелать ли один connection к БД на каждый отдельный пользовательский сеанс, и передавать его в сессии. Или в одном сеансе, в каждом классе, работающем с БД стоит делать свой екземпляр connection?

Не ясно, что ты понимаешь под "классом, работающем с БД". Если под каждый SQL запрос использовать отдельное подклчюние к БД, проблем будет очень много. И неразрешимые на уровне СУБД взаимоблокировки, и несогласованность данных.


1. Пусть у создан объект "сеанс пользователя", который живёт от момента регистрации пользователя в Web приложении, до выхода и хранит его состояние.

Тогда "connection к БД" можно использовать несколькими способами.

а. Создать в каждом сеансе пользователя свой "connection к БД". Этот подход позволит не завершать транзакцию БД между http запросами, но когда пользователей очень много, для хранения всех "connection к БД" потребуется много памяти как на в сервере приложений, так и в СУБД.
Чаще используется другой подход.
б. Создаёся пул "connection к БД" оптимального размера. В процессе выполнения http запроса "сеанс пользователя" находит в пуле свободный "connection к БД" и забирает его для выполнения всех своих запросов к БД (если в пуле нет свободных подключений, создаётся дополнительный "connection к БД"). Перед завершением обработки http запроса, "сеанс пользователя" завершает свою транзакцию БД и возвращает "connection к БД" в пул.

Если пользователь работает с Web приложением не создавая сеанса, то нужно использовать модифицированный подход б.

В процессе выполнения http запроса объект "http запрос" находит в пуле свободный "connection к БД" и забирает его для выполнения всех своих запросов к БД. Перед завершением обработки http запроса, "http запрос" завершает свою транзакцию БД и возвращает "connection к БД" в пул.

Как правило работа с пулом подключений к БД скрыта от разработчика приложения. Требуется только соблюдать некоторые стандарты (например, всегда завершать транзакцию), и настроить сервер приложений.
...
Рейтинг: 0 / 0
26.01.2007, 17:02
    #34286221
mcureenab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Установка правильного соединения с БД при проектировании WEB-приложения
karlsonchikУважаемые господа.... Тут вот ещё один вопрос назрел )))))) как в Java отследить закрыта ли транзакция или нет. Вот, например, у меня есть хранимая процедура, которая заполняет временную таблицу. эта процедура повешена на кнопку... Пользователь нажимает на неё и ждёт пару сек... но если он не дождался и нажал кнопку ещё раз, то база виснет: очень вырастают ред-логи, рбс, КОРОЧЕ завал ))))) Так вот каким образом я могу в java проверить следующие моменты: отработала ли процедура или нет, произошёл ли комит(завершена ли транзакция)

Я конечно решил эту траблу примитивно пока)))))) по онклик делаю кнопку desable.... но это не есть хороший выход

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

Фиксировать транзакцию должно твоё приложение, иначе ты не сможешь обеспечить когерентность локального буфера записей с таблицами БД. Таким образом ты можешь отследить наличие активной транзакции в твоём приложении.
...
Рейтинг: 0 / 0
26.01.2007, 17:05
    #34286232
mcureenab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Установка правильного соединения с БД при проектировании WEB-приложения
karlsonchik mcureenab
На стороне JVM драйвер доступа к БД это исключение может обернуть в исключение Java и тогда нужно его ловить в блоке обработки исключений.

Уважаемый, mcureenab!!! А можно про это по подробнее, если не затруднит... ))))))
И вообще большущее спасибо что откликнулись )))))))) !!!!!!

Почитай про классы доступа к БД, про их методы выполнения SQL запросов и про исключения, которые они поднимают.
Про обработку исключений Java написано в каждом букваре.
...
Рейтинг: 0 / 0
26.01.2007, 17:22
    #34286302
AlexTheRaven
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Установка правильного соединения с БД при проектировании WEB-приложения
karlsonchikКак правильно определить соединение с БД (в моём случае Oracle) при проектировании WEB-приложения (язык реализации Java)?
Если действительно большая нагрузка и большие издержки на установку соединения - тогда пул соединений с БД, иначе - одно соединение на каждое выполнение серверной страницы.
В любом случае, не надо забывать коммитить запросы в конце каждой серверной страницы.
Проблема в том, что http не отслеживает состояния сессии. Интерпретатор на знает, когда заканчивается сессия, если ему явно об этом не сказать. Я когда-то учил сервер понимать, ушёл ли пользователь с сайта, применяя на клиенте JavaScript, но это ненадёжно. В результате если пользователь резко ушёл с сайта - запрос может остаться незакоммиченным, объекты БД - заблокированными, соединение - висящим в пустоте и кушающим ресурсы.
...
Рейтинг: 0 / 0
26.01.2007, 18:29
    #34286527
mcureenab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Установка правильного соединения с БД при проектировании WEB-приложения
AlexTheRavenЯ когда-то учил сервер понимать, ушёл ли пользователь с сайта, применяя на клиенте JavaScript, но это ненадёжно. В результате если пользователь резко ушёл с сайта - запрос может остаться незакоммиченным, объекты БД - заблокированными, соединение - висящим в пустоте и кушающим ресурсы.

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

Хорошим тоном можно считать деление большой бизнес операции на ряд коротких системных транзакций, которые выполняются без прерываний на общение с пользователем и прочими ненадёжными узлами системы.
...
Рейтинг: 0 / 0
Форумы / Разработка информационных систем [игнор отключен] [закрыт для гостей] / Установка правильного соединения с БД при проектировании WEB-приложения / 14 сообщений из 14, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]