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

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

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

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

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

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


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


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

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


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

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

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

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

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

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

1. а почему в процедуре не сделать оповещение об окончании (dbms_alert, dbms_pipe)?
2. disable для кнопки, на которую нажимать не нужно - вполне нормальное решение
3. как-то вопрос не для того форума...
...
Рейтинг: 0 / 0
Установка правильного соединения с БД при проектировании WEB-приложения
    #34286195
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Установка правильного соединения с БД при проектировании WEB-приложения
    #34286221
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
karlsonchikУважаемые господа.... Тут вот ещё один вопрос назрел )))))) как в Java отследить закрыта ли транзакция или нет. Вот, например, у меня есть хранимая процедура, которая заполняет временную таблицу. эта процедура повешена на кнопку... Пользователь нажимает на неё и ждёт пару сек... но если он не дождался и нажал кнопку ещё раз, то база виснет: очень вырастают ред-логи, рбс, КОРОЧЕ завал ))))) Так вот каким образом я могу в java проверить следующие моменты: отработала ли процедура или нет, произошёл ли комит(завершена ли транзакция)

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

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

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

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

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

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

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


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