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

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

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

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

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

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

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

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

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

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

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

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

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

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



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


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

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

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

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

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

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



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

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


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