|
|
|
Конкуренция нескольких Java-приложений за ресурс в БД Oracle
|
|||
|---|---|---|---|
|
#18+
Коллеги, прошу помощи в следующем вопросе! Цель: Необходимо обеспечить право на ресурс в БД Oracle (одна строка в таблице) первому добежавшему Java-приложению из нескольких. Есть БД для высоконагруженного OLTP-приложения, в которой крутится значительная часть логики. Есть несколько независимых, т.е. не подозревающих о существовании друг друга Java-приложения (работают на территориально распределенных WAS). Существуют ситуации, когда любое из них должно запустить ХП в Oracle, но только первое достучавшееся и только один раз, для чего ХП (или приложение) должна выставить флаг (изменить запись в таблице). SELECT … FOR UPDATE может гарантировать блокировку и защиту от многократного изменения. НО в случае аварийного завершения приложения строка остаётся недоступной для изменения живыми приложениями. Каков общий подход для решения подобных задач в связке Java-Oracle? Что можете посоветовать? Буду благодарен за любые конструктивные предложения и замечания. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2015, 13:20 |
|
||
|
Конкуренция нескольких Java-приложений за ресурс в БД Oracle
|
|||
|---|---|---|---|
|
#18+
Нужно чтобы аварийно упавший аппликейшен отпустил коннект. Oracle DBMS увидет что сеанс завершён и откатит SELECT … FOR UPDATE. Надо посмотреть как вы испольузеете пул. И что происходит с сетевым соединением после падения. В корректном варианте клиентский сокет должен быть закрыть. Но я-бы поставил вопрос о целесообразности использования таблицы в качестве монитора или мьютекса. Посмотрите описание пакетов DBMS_LOCK и возможно DBMS_ALERT. Может поможет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2015, 13:44 |
|
||
|
Конкуренция нескольких Java-приложений за ресурс в БД Oracle
|
|||
|---|---|---|---|
|
#18+
urvas, Можно подробнее про "строка остаётся недоступной"? Почему у вас так происходит? После того как приложение отвалилось строки должны быть доступными. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2015, 13:45 |
|
||
|
Конкуренция нескольких Java-приложений за ресурс в БД Oracle
|
|||
|---|---|---|---|
|
#18+
maytonНужно чтобы аварийно упавший аппликейшен отпустил коннект. +1 либо менять метод блокировки. Не с горы же клиенты начали делать SELECT … FOR UPDATE ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2015, 13:52 |
|
||
|
Конкуренция нескольких Java-приложений за ресурс в БД Oracle
|
|||
|---|---|---|---|
|
#18+
Могу рассказать, как это делалось в СУБД, не поддерживающих SELECT … FOR UPDATE Для этого используется уровень изоляции, поддерживающий грязные чтения: 1. первая стартовавшая транзакция обновляет запись в таблице (0->1) 2. другие транзакции, поскольку они dirty read, видят эту 1 и ничего не предпринимают 3. в конце работы первой транзакции делается обратное обновление 1 на 0 В случае, если коннект отвалился во время работы 1-й транзакции, сервер делает откат по таймауту, таким образом, запись не блокируется навсегда ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2015, 13:54 |
|
||
|
Конкуренция нескольких Java-приложений за ресурс в БД Oracle
|
|||
|---|---|---|---|
|
#18+
Аффтар! я делал такую блокировку только в модальном окне и польз-ли не далеко друг от друга. Либо 3 вар-та: - вообще не блокировать (без UPDATE) - как сейчас - добавить поле\флаг в БД - хибер с его методами. вам решать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2015, 13:57 |
|
||
|
Конкуренция нескольких Java-приложений за ресурс в БД Oracle
|
|||
|---|---|---|---|
|
#18+
xifr, Работает Java-приложение, которое блокирует строки. Вынимаю сетевой (LAN) кабель, при этом в СУБД сессии остаются, блокировки со строки не снимаются. Сразу не предупредил, извините, - мопед не мой. :-) Т.е. я не Java-разработчик ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2015, 13:59 |
|
||
|
Конкуренция нескольких Java-приложений за ресурс в БД Oracle
|
|||
|---|---|---|---|
|
#18+
ivanra, тогда уж лучше флаг - взял на редактирование) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2015, 13:59 |
|
||
|
Конкуренция нескольких Java-приложений за ресурс в БД Oracle
|
|||
|---|---|---|---|
|
#18+
urvasВынимаю сетевой (LAN) кабель, при этом в СУБД сессии остаются БД профи есть? Пусть киляет сессии. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2015, 14:00 |
|
||
|
Конкуренция нескольких Java-приложений за ресурс в БД Oracle
|
|||
|---|---|---|---|
|
#18+
Petro123ivanra, тогда уж лучше флаг - взял на редактирование) Тут весь фокус в том, что при обновлении и грязных чтениях остальные соединения сразу видят, что запись занята и не блокируются (могут выполнять другую полезную работу). При попытке сразу брать на редактирование, будет блокировка, пока предыдущий "хозяин" не отпустит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2015, 14:05 |
|
||
|
Конкуренция нескольких Java-приложений за ресурс в БД Oracle
|
|||
|---|---|---|---|
|
#18+
Коллеги, большое спасибо, но я думал, что вы мне про опыт с чем-то подобным JMS и Oracle AQ расскажете. Большинство из предлагаемого рассматривалось, но было отвергнуто. Для киляния сессии необходимо её пометить, желательно не только именем приложения, но и каким-то таймштампом, и каким-нибудь джобом проверять v$session (весьма небыстрое представление). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2015, 14:13 |
|
||
|
Конкуренция нескольких Java-приложений за ресурс в БД Oracle
|
|||
|---|---|---|---|
|
#18+
1. Для каких именно целей используется select for update? (т.е. на какое время удерживается блокировка) 2. Вполне возможно, что в таком раскладе лучше использовать оптимистическое блокирование, т.е. блокировка накладывается только на момент изменения данных, а то и вообще просто в контексте самого апдейта (без select for update), если же данные с момента чтения изменились, выдается эксепшн, мол. пока вы чесали репу, данные уже были изменены, прочитайте заново и тогда уж правьте по-новой ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2015, 14:13 |
|
||
|
Конкуренция нескольких Java-приложений за ресурс в БД Oracle
|
|||
|---|---|---|---|
|
#18+
urvasСуществуют ситуации, когда любое из них должно запустить ХП в Oracle, но только первое достучавшееся и только один раз, для чего ХП (или приложение) должна выставить флаг (изменить запись в таблице). SELECT … FOR UPDATE может гарантировать блокировку и защиту от многократного изменения. А. Для запуска ХП. Так может тогда вообще отказаться от таблицы, в которой фиксятся запуски? А сразу смотреть all_jobs? (если уже запущено, то и не запускаем). А уже в самой процедуре вести протокол запусков, если он вообще нужен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2015, 14:18 |
|
||
|
Конкуренция нескольких Java-приложений за ресурс в БД Oracle
|
|||
|---|---|---|---|
|
#18+
urvasРаботает Java-приложение, которое блокирует строки. Вынимаю сетевой (LAN) кабель, при этом в СУБД сессии остаются, блокировки со строки не снимаются. Таблица "занятия ресурса". При старте приложение пишет " я схватил", свой IP, время захвата, время обновления. Каждый 30 секунд обновляет статус. Если в течении минуты не обновило- ресурс считается свободным и может быть взят другим. Соответственно само приложение должно, дойдя до обновления статуса проверить, не прошла ли минута, и если прошла- сделать харакири. Блокировки собственно таблицы- только в момент взятия. Остальное- изменения commit'ятся. Заодно будет лог- кто, когда и сколько захватывал ресурс. Работать через системные вещи- требуются права админа для снятия блокировки, что не всегда допустимо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2015, 14:22 |
|
||
|
Конкуренция нескольких Java-приложений за ресурс в БД Oracle
|
|||
|---|---|---|---|
|
#18+
JDS, Первый захвативший тем самым не даёт другим прочитать значение флага, независимо от того разрешительный или запретительный он. Если необходимо изменить флаг, то меняет. Без update все могут прочитать разрешительный флаг и отработать код, а этого и не надо. Вопрос больше в том, как избежать блокировок при аварийном завершении. Т.е. можно и без update, но тогда должен быть гарантирован строгий порядок запросов, т.е. некая очередь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2015, 14:22 |
|
||
|
Конкуренция нескольких Java-приложений за ресурс в БД Oracle
|
|||
|---|---|---|---|
|
#18+
urvasКоллеги, большое спасибо, но я думал, что вы мне про опыт с чем-то подобным JMS и Oracle AQ расскажете. Большинство из предлагаемого рассматривалось, но было отвергнуто. Для киляния сессии необходимо её пометить, желательно не только именем приложения, но и каким-то таймштампом, и каким-нибудь джобом проверять v$session (весьма небыстрое представление). Какой смысл тебе чего-то советовать по JMS или AQ если неясно о чём твоя задача? Что делает? Как устроена? Почему идёт битва за ресурс? Есть ли альтернативная подход? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2015, 14:23 |
|
||
|
Конкуренция нескольких Java-приложений за ресурс в БД Oracle
|
|||
|---|---|---|---|
|
#18+
urvasxifr, Работает Java-приложение, которое блокирует строки. Вынимаю сетевой (LAN) кабель, при этом в СУБД сессии остаются, блокировки со строки не снимаются. Сразу не предупредил, извините, - мопед не мой. :-) Т.е. я не Java-разработчик В этом случае скорее всего нужно настраивать СУБД, но это конечно не всегда бывает возможно/хорошо. По хорошему, ваши приложения могут работать не на прямую с СУБД, а через сервер приложение, тогда все логику синхранизации и блокировок, можно перенести на сервер, а не на СУБД. По мне так более правильно с точки зрения архитектуры. Например, может быть вам вообще это будет проще сделать через очереди (на сервере). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2015, 14:24 |
|
||
|
Конкуренция нескольких Java-приложений за ресурс в БД Oracle
|
|||
|---|---|---|---|
|
#18+
Alexey TominКаждый 30 секунд обновляет статус. Это КРИТИЧЕСКИ много! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2015, 14:24 |
|
||
|
Конкуренция нескольких Java-приложений за ресурс в БД Oracle
|
|||
|---|---|---|---|
|
#18+
JDS А сразу смотреть all_jobs? Опять всё сведется к тому, что все НЕЗАВИСИМЫЕ приложения попытаются запустить джобы, а должено отработать только одно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2015, 14:27 |
|
||
|
Конкуренция нескольких Java-приложений за ресурс в БД Oracle
|
|||
|---|---|---|---|
|
#18+
urvasПервый захвативший тем самым не даёт другим прочитать значение флага, независимо от того разрешительный или запретительный он. Если необходимо изменить флаг, то меняет. Без update все могут прочитать разрешительный флаг и отработать код, а этого и не надо. Это понятно - так и говорю, мол может запускать не напрямую, а через джобы и смотреть при этом, не запущен ли уже, если запущен, то и не запускаем, тогда и таблица эта с флагом не нужна же, а если нужна, то заполнять ее уже из самой отрабатываемой ХП. urvasВопрос больше в том, как избежать блокировок при аварийном завершении. Т.е. можно и без update, но тогда должен быть гарантирован строгий порядок запросов, т.е. некая очередь. Если нужна именно очередь, возможно, вариант - в самой ХП прописать ожидание завершения предыдущего запуска. То есть: 1. Из Джава приходит команда на постановку ХП на обработку (например, добавляет джоб) 2. Все. Все остальное - в том числе и возможность выполнения отслеживает сама ХП (а она уже не зависит от клиента и может блокировать что угодно хоть отвалится клиент, хоть нет, ей пофиг, она в джобе )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2015, 14:32 |
|
||
|
Конкуренция нескольких Java-приложений за ресурс в БД Oracle
|
|||
|---|---|---|---|
|
#18+
xifrПо хорошему, ваши приложения могут работать не на прямую с СУБД, а через сервер приложение, тогда все логику синхранизации и блокировок, можно перенести на сервер, а не на СУБД. По мне так более правильно с точки зрения архитектуры. Например, может быть вам вообще это будет проще сделать через очереди (на сервере). 1. Серверов приложений и так несколько, но проблемы это не снимает. Обвязка между несколькими СП, некий координатор? Вопросо будет ещё больше, ИМХО. 2.Вот про очереди бы поподробнее. Точнее, про все составляющие этого процесса. Я не даром упомянул про JMS и AQ. Есть подобный опыт? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2015, 14:32 |
|
||
|
Конкуренция нескольких Java-приложений за ресурс в БД Oracle
|
|||
|---|---|---|---|
|
#18+
urvasОпять всё сведется к тому, что все НЕЗАВИСИМЫЕ приложения попытаются запустить джобы, а должно отработать только одно. Если грамотно наколхозить, то не сведется ) Ну и все-таки вариант повторю: 1. ХП ставим джобом (поставили и забыли), не надо ничего блокировать 2. А уже в самой ХП может делать что угодно, выставлять блокировку например, что типа я пошла работать, остальные сидят курят. Если же ХП вдит, что уже кто-то пашет (не может выставить флаг), ну или ждет (тут механизмы тоже разные могут быть), или спокойно завершается необходимым образом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2015, 14:36 |
|
||
|
Конкуренция нескольких Java-приложений за ресурс в БД Oracle
|
|||
|---|---|---|---|
|
#18+
urvas2.Вот про очереди бы поподробнее. сначала select update убрать. А тогда и очереди не понадобятся). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2015, 14:49 |
|
||
|
Конкуренция нескольких Java-приложений за ресурс в БД Oracle
|
|||
|---|---|---|---|
|
#18+
maytonurvasКоллеги, большое спасибо, но я думал, что вы мне про опыт с чем-то подобным JMS и Oracle AQ расскажете. Большинство из предлагаемого рассматривалось, но было отвергнуто. Для киляния сессии необходимо её пометить, желательно не только именем приложения, но и каким-то таймштампом, и каким-нибудь джобом проверять v$session (весьма небыстрое представление). Какой смысл тебе чего-то советовать по JMS или AQ если неясно о чём твоя задача? Что делает? Как устроена? Почему идёт битва за ресурс? Есть ли альтернативная подход? +1 Аффтар просто хочет поучиться очередям. За счёт фирмы. Зачем ему блокировать он сам не знает. Удачи аффтару! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2015, 14:52 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39045823&tid=2124964]: |
0ms |
get settings: |
12ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
224ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
68ms |
get tp. blocked users: |
2ms |
| others: | 245ms |
| total: | 584ms |

| 0 / 0 |
