powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Java [игнор отключен] [закрыт для гостей] / Mybatis vs Ora-04068
25 сообщений из 270, страница 2 из 11
Mybatis vs Ora-04068
    #40069673
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev
Ради того, что бы передавать данные между разными SQL командами пакетные переменные (состояние) и используют. IMHO & AFAIK

Похоже, Вам очень не повезло с системами.
Передавать состояние транзакции от вызова к вызову внетранзакционными механизмами (а состояние пакета НЕ транзакционно) - крайне плохой дизайн. Не говорю уже, что в случае пула следующий вызов может прилететь вообще в другую сессию.
Состояния пакетов используют совершенно иначе.
...
Рейтинг: 0 / 0
Mybatis vs Ora-04068
    #40069674
andrey_anonymousКоллеги, буду признателен за ссылки, где можно ознакомиться с указанными заклинаниями.
Вот что-то первое попавшееся по Spring AOP . По сути мы говорим что все нужные классы оборачиваются доп логикой (аспектом). Весь остальной код не знает что это вообще происходит, т.е. менять в коде приложения ничего не надо. Правда это очень неявная логика, т.е. если не знаешь что кто-то так настроил, то не всегда догадаешься что что-то такое происходит.

А с RetryTemplate мы в конкретном месте кода можем написать "повтори это N раз пока не получится". Вот даже в новом Spring'e такие штуки аннотациями можно настраивать .
andrey_anonymousПередавать состояние транзакции от вызова к вызову внетранзакционными механизмами (а состояние пакета НЕ транзакционно) - крайне плохой дизайн. Не говорю уже, что в случае пула следующий вызов может прилететь вообще в другую сессию.Обычно такого не может произойти потому как мы используем одно БД соединение на обработку всего HTTP запроса.
...
Рейтинг: 0 / 0
Mybatis vs Ora-04068
    #40069675
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev
Когда приложение желает получить чужую DB-сессию из пула, оно должно обнулить состояние - что логично.

Вы сами выше писали про пункты должностной инструкции.
Попробуйте мысленно представить воплощение своего предложение на более-менее нагруженной системе и оценить время реакции DBA на новый выверт разработчика.
...
Рейтинг: 0 / 0
Mybatis vs Ora-04068
    #40069676
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stanislav Bashkyrtsev
По сути

Премного благодарен.
...
Рейтинг: 0 / 0
Mybatis vs Ora-04068
    #40069678
SpringMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymous,

1) Встроенный механизм интерцепторов в mybatis: https://mybatis.org/mybatis-3/configuration.html#plugins - тут надо проверять все ли как нам надо заработает, но это очень похоже на правду
2) Внешний aspectj (можно вешать на методы по аннотации, по имени пакета/класса/метода): https://dzone.com/articles/implementing-aop-with-spring-boot-and-aspectj - тут со спрингом, но можно и без него прикрутить
...
Рейтинг: 0 / 0
Mybatis vs Ora-04068
    #40069679
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous,
Вам уже сказали.
Длинная транзакция. Первый запрос ставит состояние в хранимке.
Второй запрос переводит деньги.
Вклиниваться нельзя. И повторять команду 1 или 2 после райзе тоже нельзя.
Вы упрямо твердите что можно.
ОК. Возможно юз кейс выше у вас никогда не бывает приказом по части)))
...
Рейтинг: 0 / 0
Mybatis vs Ora-04068
    #40069680
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous

Похоже, Вам очень не повезло с системами.
Передавать состояние транзакции от вызова к вызову внетранзакционными механизмами (а состояние пакета НЕ транзакционно) - крайне плохой дизайн.

При чем тут состояние транзакций, пул соединений?

Есть последовательность кода / API:

проициализоровать
выполнить действие 1
выполнить действие 2
...
выполнить действие 100500
commit

хорошо, если это можно обернуть в одну процедуру/анонимный блок, но если бизнес операция сложная, то сделать одной SQL-командной может и не получится (или будет очень громоздко). Разумеется откат/повтор нужен всего блока. Начиная с инициализации

andrey_anonymous

Состояния пакетов используют совершенно иначе.

?

andrey_anonymous

Не говорю уже, что в случае пула следующий вызов может прилететь вообще в другую сессию.

Так тут проблема не в системе, а неправильного использование пула.

Mybatis vs Ora-04068
...
Рейтинг: 0 / 0
Mybatis vs Ora-04068
    #40069682
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous
Leonid Kudryavtsev
Когда приложение желает получить чужую DB-сессию из пула, оно должно обнулить состояние - что логично.

Вы сами выше писали про пункты должностной инструкции.
Попробуйте мысленно представить воплощение своего предложение на более-менее нагруженной системе и оценить время реакции DBA на новый выверт разработчика.


DBMS_SESSION.RESET_PACKAGE

Какие замечания у DBA ?
...
Рейтинг: 0 / 0
Mybatis vs Ora-04068
    #40069684
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous
Когллеги, подскажите плиз, какие существуют варианты воткнуть обработку oracle exception ORA-04068 в приложении, использующем MyBatis?
Обработка ora-4068, понятно, заключается в повторе вызвавшей сбой операции.
Наши джависты вменяемого решения предложить отчего-то не в состоянии - предлагают чуть ли не все вызовы в проекте catch-ами обвешивать.

Скорее всего джависты правы. Что такое ORA-0468 ?

Код: java
1.
2.
3.
4.
5.
ORA-04068: existing state of packages string has been discarded

Cause: One of errors 4060 - 4067 when attempt to execute a stored procedure.

Action: Try again after proper re-initialization of any application's state.



В экшене написано "Try again".

Я еще могу предложить синхронно останавливать комплекс приложения вместе с модернизацией PLSQL пакетов.
В этом случае Java-приложение всегда будет видеть одинаковое состояние пакетов без перекомпилляций. Но очевидно
что кто-то из ваших девопсов оказался хитрее и проигнорировал такую возможность. Сам себя перехитрил.

Что можно придумать коробочное на строне приложения чтоб была не нужна перезагрузка?
Я не знаю имеет ли Батис шаблон retrier но вот один вариант такого шаблона https://github.com/rholder/guava-retrying

Вы можете использовать отдельно на уровне выше батиса.
...
Рейтинг: 0 / 0
Mybatis vs Ora-04068
    #40069686
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
andrey_anonymous,
Вам уже сказали.
Длинная транзакция. Первый запрос ставит состояние в хранимке.
Второй запрос переводит деньги.

На ближайшем code review "гений", сотворивший эту пакость, получит по шапке.
Ему будет на пальцах объяснено что такое statement, что есть транзакции, что такое пул соединений и как правильно следует решать такую задачу.
Причем правильных решений, в зависимости от деталей процесса, будет предложено несколько - и ни одно из них не будет предполагать передачу информации между вызовами посредством переменных пакета.
Коллеги, давайте исходить из того, что в своей области профессиональных знаний я тоже немножко понахватался, за десятки-то лет :)
...
Рейтинг: 0 / 0
Mybatis vs Ora-04068
    #40069687
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev
DBMS_SESSION.RESET_PACKAGE
Какие замечания у DBA ?

Наличие DBMS_SESSION.RESET_PACKAGE в TOP SQL по AWR-отчету.
...
Рейтинг: 0 / 0
Mybatis vs Ora-04068
    #40069690
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous

Ему будет на пальцах объяснено что такое statement, что есть транзакции, что такое пул соединений и как правильно следует решать такую задачу.

Можно тогда нам кратко объяснить, "что такое statement, что есть транзакции"

Я всегда предполагал, что транзакция может состоять из множества statement. Поэтому они и называются по разному )))
...
Рейтинг: 0 / 0
Mybatis vs Ora-04068
    #40069693
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,
Он не знает разницы между физической транзакцией и бизнес транз.
...
Рейтинг: 0 / 0
Mybatis vs Ora-04068
    #40069696
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev
andrey_anonymous

Состояния пакетов используют совершенно иначе.

?

Оффтопик тут.
Переменные пакета обладают теми же свойствами, что и глобальные переменные . Надо дальше объяснять почему их избегают в логике приложения и как именно это делается?
Один из типовых методов использования - самодельное узко специальное кэширование. Типовая реализация - кэш наполняется по факту использования, от сброса кэша логика приложения не страдает.
Изредка можно увидеть использование пакетной переменной для управления уровнем логирования, хотя на сегодняшний день это удобнее делать методами условной компиляции или теми же контекстами. Этот вариант тоже не способен причинить приложению попаболь при сбросе состояния.
Если же пакету по неким неведомым причинам очень-очень требуется инициализация (на практике не встречал ни разу), то инициализационный код помещают в секцию инициализации пакета.
...
Рейтинг: 0 / 0
Mybatis vs Ora-04068
    #40069697
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous,
Переменная пакета имеет уровень пакета а не.. Глобальная
...
Рейтинг: 0 / 0
Mybatis vs Ora-04068
    #40069699
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous,
Доказывать тут что исспользовать переменные пакета не профессионально это глупость.
Сами пакеты нельзя в веб проектах))))
...
Рейтинг: 0 / 0
Mybatis vs Ora-04068
    #40069700
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev
Я всегда предполагал, что транзакция может состоять из множества statement. Поэтому они и называются по разному )))

Вы абсолютно правы.
Но если Вам требуется в рамках одной транзакции выполнить несколько statements, то у адекватного программиста передача параметров произойдет на уровне приложения в явном виде.
Exception в одном из statement, если, конечно, подлежит обработке, не потребует отката 100500 предыдущих действий указанной транзакции.
Если же бизнес-транзакция достаточно сложна и предполагает в своем составе несколько отдельных транзакций БД, то для организации взаимодействия используются совсем иные механизмы - обычно подходящий messaging. Оракель на этот случай предоставляет вполне транзакционный AQ.
...
Рейтинг: 0 / 0
Mybatis vs Ora-04068
    #40069701
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Веб проект это пул. А пул это анонимный клиент. А он это короткие транзакции без состояния.
Это по классике в вузах.
...
Рейтинг: 0 / 0
Mybatis vs Ora-04068
    #40069702
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
andrey_anonymous,
Переменная пакета имеет уровень пакета а не.. Глобальная

Вы не в теме.
...
Рейтинг: 0 / 0
Mybatis vs Ora-04068
    #40069703
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
Сами пакеты нельзя в веб проектах))))

Отчего же?
...
Рейтинг: 0 / 0
Mybatis vs Ora-04068
    #40069704
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous,
>Exception в одном из statement, если, конечно, подлежит обработке, не потребует отката 100500 предыдущих действий указанной транзакции
=
У вас ОРМ.
Значит не вы отправляете инструкции. И перехватить в нижнем слое проблематично.
...
Рейтинг: 0 / 0
Mybatis vs Ora-04068
    #40069705
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous
...Надо дальше объяснять почему их избегают в логике приложения и как именно это делается?...

само наличие данного топика, говорит о том, что избежать-то и не получилось )))

andrey_anonymous

Один из типовых методов использования - самодельное узко специальное кэширование. Типовая реализация - кэш наполняется по факту использования, от сброса кэша логика приложения не страдает.

Типовая?.... ????

Ну и кэш который передается между чужими коннектами (через пул) - это жесть. IMHO

Осмысленность кэша на уровне сессии передающейся между чужими коннектами - для меня загадка.
Или должна быть на уровне апп сервера (приложения), один на все сессии (т.е. уровнем выше)
Или должен быть на уровне одной операции/транзакции/соединения - т.е. не передаваться и очищаться между коннектами.

p.s.
предлагаю каждому остаться при своем мнение
p.p.s.
вариантов решений накидали, думаю автор не новичок и не студент, т.ч. сам разбирется, что в его случае проще и лучше

Как я понимаю, два принципиальных варианта никто не оспаривает:
1. Организационный. После наката патча/обновления на базу переинициализровать клиентов.
1.1. Жесткий вариант - перезапускать
1.2. Более мягкий вариант (требует программирование, нового API) - "сдувать быстро пул до нулевого размера"
22321026
2. Программный
2.1. Корректно (пере) инициализировать соединение в момент получения из пула
2.2. Реализовывать повтор
etc...
...
Рейтинг: 0 / 0
Mybatis vs Ora-04068
    #40069706
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous
PetroNotC Sharp
Сами пакеты нельзя в веб проектах))))

Отчего же?
22321078
...
Рейтинг: 0 / 0
Mybatis vs Ora-04068
    #40069709
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
andrey_anonymous
пропущено...
Отчего же?
22321078

Тема не раскрыта.
Даже не оспаривая этот великолепный тезис о сферическом коне, спрошу: как пакет препятствует 22321078 ?
...
Рейтинг: 0 / 0
Mybatis vs Ora-04068
    #40069710
SpringMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid Kudryavtsev

1.2. Более мягкий вариант (требует программирование, нового API) - "сдувать быстро пул до нулевого размера"
22321026

Ну вот я имел ввиду именно на уровне конфигурации пула. В пулах в том или ином виде есть настройки: "минимальное количество коннектов" и "сколько времени держать коннект в пуле в случае бездействия". Вот обе настройки в 0. Это конечно не самое хорошее решение, но в определенных жизненных обстоятельствах может снять немного боли. Ну и, возможно, добавить немного боли в будущем :)
...
Рейтинг: 0 / 0
25 сообщений из 270, страница 2 из 11
Форумы / Java [игнор отключен] [закрыт для гостей] / Mybatis vs Ora-04068
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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