powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Конкуренция нескольких Java-приложений за ресурс в БД Oracle
25 сообщений из 70, страница 1 из 3
Конкуренция нескольких Java-приложений за ресурс в БД Oracle
    #39045757
Фотография urvas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коллеги, прошу помощи в следующем вопросе!

Цель: Необходимо обеспечить право на ресурс в БД Oracle (одна строка в таблице) первому добежавшему Java-приложению из нескольких.
Есть БД для высоконагруженного OLTP-приложения, в которой крутится значительная часть логики. Есть несколько независимых, т.е. не подозревающих о существовании друг друга Java-приложения (работают на территориально распределенных WAS). Существуют ситуации, когда любое из них должно запустить ХП в Oracle, но только первое достучавшееся и только один раз, для чего ХП (или приложение) должна выставить флаг (изменить запись в таблице). SELECT … FOR UPDATE может гарантировать блокировку и защиту от многократного изменения. НО в случае аварийного завершения приложения строка остаётся недоступной для изменения живыми приложениями.
Каков общий подход для решения подобных задач в связке Java-Oracle? Что можете посоветовать?
Буду благодарен за любые конструктивные предложения и замечания. Спасибо.
...
Рейтинг: 0 / 0
Конкуренция нескольких Java-приложений за ресурс в БД Oracle
    #39045780
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно чтобы аварийно упавший аппликейшен отпустил коннект. Oracle DBMS
увидет что сеанс завершён и откатит SELECT … FOR UPDATE.
Надо посмотреть как вы испольузеете пул. И что происходит с сетевым
соединением после падения. В корректном варианте клиентский сокет
должен быть закрыть.

Но я-бы поставил вопрос о целесообразности использования таблицы в качестве
монитора или мьютекса. Посмотрите описание пакетов DBMS_LOCK и возможно
DBMS_ALERT. Может поможет.
...
Рейтинг: 0 / 0
Конкуренция нескольких Java-приложений за ресурс в БД Oracle
    #39045781
xifr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
urvas,

Можно подробнее про "строка остаётся недоступной"? Почему у вас так происходит? После того как приложение отвалилось строки должны быть доступными.
...
Рейтинг: 0 / 0
Конкуренция нескольких Java-приложений за ресурс в БД Oracle
    #39045793
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНужно чтобы аварийно упавший аппликейшен отпустил коннект.
+1
либо менять метод блокировки.
Не с горы же клиенты начали делать SELECT … FOR UPDATE
...
Рейтинг: 0 / 0
Конкуренция нескольких Java-приложений за ресурс в БД Oracle
    #39045798
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Могу рассказать, как это делалось в СУБД, не поддерживающих SELECT … FOR UPDATE
Для этого используется уровень изоляции, поддерживающий грязные чтения:
1. первая стартовавшая транзакция обновляет запись в таблице (0->1)
2. другие транзакции, поскольку они dirty read, видят эту 1 и ничего не предпринимают
3. в конце работы первой транзакции делается обратное обновление 1 на 0

В случае, если коннект отвалился во время работы 1-й транзакции, сервер делает откат по таймауту, таким образом, запись не блокируется навсегда
...
Рейтинг: 0 / 0
Конкуренция нескольких Java-приложений за ресурс в БД Oracle
    #39045802
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Аффтар!
я делал такую блокировку только в модальном окне и польз-ли не далеко друг от друга.
Либо 3 вар-та:
- вообще не блокировать (без UPDATE)
- как сейчас
- добавить поле\флаг в БД
- хибер с его методами.
вам решать
...
Рейтинг: 0 / 0
Конкуренция нескольких Java-приложений за ресурс в БД Oracle
    #39045806
Фотография urvas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xifr,

Работает Java-приложение, которое блокирует строки. Вынимаю сетевой (LAN) кабель, при этом в СУБД сессии остаются, блокировки со строки не снимаются.

Сразу не предупредил, извините, - мопед не мой. :-) Т.е. я не Java-разработчик
...
Рейтинг: 0 / 0
Конкуренция нескольких Java-приложений за ресурс в БД Oracle
    #39045807
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanra,
тогда уж лучше флаг - взял на редактирование)
...
Рейтинг: 0 / 0
Конкуренция нескольких Java-приложений за ресурс в БД Oracle
    #39045810
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
urvasВынимаю сетевой (LAN) кабель, при этом в СУБД сессии остаются
БД профи есть?
Пусть киляет сессии.
...
Рейтинг: 0 / 0
Конкуренция нескольких Java-приложений за ресурс в БД Oracle
    #39045816
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123ivanra,
тогда уж лучше флаг - взял на редактирование)
Тут весь фокус в том, что при обновлении и грязных чтениях остальные соединения сразу видят, что запись занята и не блокируются (могут выполнять другую полезную работу). При попытке сразу брать на редактирование, будет блокировка, пока предыдущий "хозяин" не отпустит.
...
Рейтинг: 0 / 0
Конкуренция нескольких Java-приложений за ресурс в БД Oracle
    #39045823
Фотография urvas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коллеги, большое спасибо, но я думал, что вы мне про опыт с чем-то подобным JMS и Oracle AQ расскажете. Большинство из предлагаемого рассматривалось, но было отвергнуто.

Для киляния сессии необходимо её пометить, желательно не только именем приложения, но и каким-то таймштампом, и каким-нибудь джобом проверять v$session (весьма небыстрое представление).
...
Рейтинг: 0 / 0
Конкуренция нескольких Java-приложений за ресурс в БД Oracle
    #39045824
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Для каких именно целей используется select for update? (т.е. на какое время удерживается блокировка)
2. Вполне возможно, что в таком раскладе лучше использовать оптимистическое блокирование, т.е. блокировка накладывается только на момент изменения данных, а то и вообще просто в контексте самого апдейта (без select for update), если же данные с момента чтения изменились, выдается эксепшн, мол. пока вы чесали репу, данные уже были изменены, прочитайте заново и тогда уж правьте по-новой )
...
Рейтинг: 0 / 0
Конкуренция нескольких Java-приложений за ресурс в БД Oracle
    #39045829
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
urvasСуществуют ситуации, когда любое из них должно запустить ХП в Oracle, но только первое достучавшееся и только один раз, для чего ХП (или приложение) должна выставить флаг (изменить запись в таблице). SELECT … FOR UPDATE может гарантировать блокировку и защиту от многократного изменения.
А. Для запуска ХП. Так может тогда вообще отказаться от таблицы, в которой фиксятся запуски? А сразу смотреть all_jobs? (если уже запущено, то и не запускаем). А уже в самой процедуре вести протокол запусков, если он вообще нужен.
...
Рейтинг: 0 / 0
Конкуренция нескольких Java-приложений за ресурс в БД Oracle
    #39045834
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
urvasРаботает Java-приложение, которое блокирует строки. Вынимаю сетевой (LAN) кабель, при этом в СУБД сессии остаются, блокировки со строки не снимаются.

Таблица "занятия ресурса".
При старте приложение пишет " я схватил", свой IP, время захвата, время обновления.
Каждый 30 секунд обновляет статус.
Если в течении минуты не обновило- ресурс считается свободным и может быть взят другим. Соответственно само приложение должно, дойдя до обновления статуса проверить, не прошла ли минута, и если прошла- сделать харакири.
Блокировки собственно таблицы- только в момент взятия. Остальное- изменения commit'ятся.
Заодно будет лог- кто, когда и сколько захватывал ресурс.

Работать через системные вещи- требуются права админа для снятия блокировки, что не всегда допустимо.
...
Рейтинг: 0 / 0
Конкуренция нескольких Java-приложений за ресурс в БД Oracle
    #39045835
Фотография urvas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDS,
Первый захвативший тем самым не даёт другим прочитать значение флага, независимо от того разрешительный или запретительный он. Если необходимо изменить флаг, то меняет. Без update все могут прочитать разрешительный флаг и отработать код, а этого и не надо.

Вопрос больше в том, как избежать блокировок при аварийном завершении. Т.е. можно и без update, но тогда должен быть гарантирован строгий порядок запросов, т.е. некая очередь.
...
Рейтинг: 0 / 0
Конкуренция нескольких Java-приложений за ресурс в БД Oracle
    #39045840
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
urvasКоллеги, большое спасибо, но я думал, что вы мне про опыт с чем-то подобным JMS и Oracle AQ расскажете. Большинство из предлагаемого рассматривалось, но было отвергнуто.

Для киляния сессии необходимо её пометить, желательно не только именем приложения, но и каким-то таймштампом, и каким-нибудь джобом проверять v$session (весьма небыстрое представление).
Какой смысл тебе чего-то советовать по JMS или AQ если неясно о чём твоя задача?
Что делает? Как устроена? Почему идёт битва за ресурс? Есть ли альтернативная подход?
...
Рейтинг: 0 / 0
Конкуренция нескольких Java-приложений за ресурс в БД Oracle
    #39045841
xifr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
urvasxifr,
Работает Java-приложение, которое блокирует строки. Вынимаю сетевой (LAN) кабель, при этом в СУБД сессии остаются, блокировки со строки не снимаются.
Сразу не предупредил, извините, - мопед не мой. :-) Т.е. я не Java-разработчик

В этом случае скорее всего нужно настраивать СУБД, но это конечно не всегда бывает возможно/хорошо.

По хорошему, ваши приложения могут работать не на прямую с СУБД, а через сервер приложение, тогда все логику синхранизации и блокировок, можно перенести на сервер, а не на СУБД.
По мне так более правильно с точки зрения архитектуры.
Например, может быть вам вообще это будет проще сделать через очереди (на сервере).
...
Рейтинг: 0 / 0
Конкуренция нескольких Java-приложений за ресурс в БД Oracle
    #39045842
Фотография urvas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey TominКаждый 30 секунд обновляет статус.



Это КРИТИЧЕСКИ много!
...
Рейтинг: 0 / 0
Конкуренция нескольких Java-приложений за ресурс в БД Oracle
    #39045848
Фотография urvas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDS А сразу смотреть all_jobs?


Опять всё сведется к тому, что все НЕЗАВИСИМЫЕ приложения попытаются запустить джобы, а должено отработать только одно.
...
Рейтинг: 0 / 0
Конкуренция нескольких Java-приложений за ресурс в БД Oracle
    #39045853
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
urvasПервый захвативший тем самым не даёт другим прочитать значение флага, независимо от того разрешительный или запретительный он. Если необходимо изменить флаг, то меняет. Без update все могут прочитать разрешительный флаг и отработать код, а этого и не надо.
Это понятно - так и говорю, мол может запускать не напрямую, а через джобы и смотреть при этом, не запущен ли уже, если запущен, то и не запускаем, тогда и таблица эта с флагом не нужна же, а если нужна, то заполнять ее уже из самой отрабатываемой ХП.

urvasВопрос больше в том, как избежать блокировок при аварийном завершении. Т.е. можно и без update, но тогда должен быть гарантирован строгий порядок запросов, т.е. некая очередь.
Если нужна именно очередь, возможно, вариант - в самой ХП прописать ожидание завершения предыдущего запуска.
То есть:
1. Из Джава приходит команда на постановку ХП на обработку (например, добавляет джоб)
2. Все. Все остальное - в том числе и возможность выполнения отслеживает сама ХП (а она уже не зависит от клиента и может блокировать что угодно хоть отвалится клиент, хоть нет, ей пофиг, она в джобе ))
...
Рейтинг: 0 / 0
Конкуренция нескольких Java-приложений за ресурс в БД Oracle
    #39045854
Фотография urvas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xifrПо хорошему, ваши приложения могут работать не на прямую с СУБД, а через сервер приложение, тогда все логику синхранизации и блокировок, можно перенести на сервер, а не на СУБД.
По мне так более правильно с точки зрения архитектуры.
Например, может быть вам вообще это будет проще сделать через очереди (на сервере).

1. Серверов приложений и так несколько, но проблемы это не снимает. Обвязка между несколькими СП, некий координатор? Вопросо будет ещё больше, ИМХО.

2.Вот про очереди бы поподробнее. Точнее, про все составляющие этого процесса. Я не даром упомянул про JMS и AQ. Есть подобный опыт?
...
Рейтинг: 0 / 0
Конкуренция нескольких Java-приложений за ресурс в БД Oracle
    #39045864
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
urvasОпять всё сведется к тому, что все НЕЗАВИСИМЫЕ приложения попытаются запустить джобы, а должно отработать только одно.
Если грамотно наколхозить, то не сведется )

Ну и все-таки вариант повторю:
1. ХП ставим джобом (поставили и забыли), не надо ничего блокировать
2. А уже в самой ХП может делать что угодно, выставлять блокировку например, что типа я пошла работать, остальные сидят курят.
Если же ХП вдит, что уже кто-то пашет (не может выставить флаг), ну или ждет (тут механизмы тоже разные могут быть), или спокойно завершается необходимым образом.
...
Рейтинг: 0 / 0
Конкуренция нескольких Java-приложений за ресурс в БД Oracle
    #39045898
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
urvas2.Вот про очереди бы поподробнее.
сначала select update убрать.
А тогда и очереди не понадобятся).
...
Рейтинг: 0 / 0
Конкуренция нескольких Java-приложений за ресурс в БД Oracle
    #39045905
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonurvasКоллеги, большое спасибо, но я думал, что вы мне про опыт с чем-то подобным JMS и Oracle AQ расскажете. Большинство из предлагаемого рассматривалось, но было отвергнуто.

Для киляния сессии необходимо её пометить, желательно не только именем приложения, но и каким-то таймштампом, и каким-нибудь джобом проверять v$session (весьма небыстрое представление).
Какой смысл тебе чего-то советовать по JMS или AQ если неясно о чём твоя задача?
Что делает? Как устроена? Почему идёт битва за ресурс? Есть ли альтернативная подход?
+1
Аффтар просто хочет поучиться очередям. За счёт фирмы.
Зачем ему блокировать он сам не знает.
Удачи аффтару!
...
Рейтинг: 0 / 0
Конкуренция нескольких Java-приложений за ресурс в БД Oracle
    #39045906
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
urvasAlexey TominКаждый 30 секунд обновляет статус.



Это КРИТИЧЕСКИ много!

Не проблема- сделай 1 и 2 секунды.
Суть в том, что время протухания больше, чем период обновления.
...
Рейтинг: 0 / 0
25 сообщений из 70, страница 1 из 3
Форумы / Java [игнор отключен] [закрыт для гостей] / Конкуренция нескольких Java-приложений за ресурс в БД Oracle
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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