|
Mybatis vs Ora-04068
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev Ради того, что бы передавать данные между разными SQL командами пакетные переменные (состояние) и используют. IMHO & AFAIK Похоже, Вам очень не повезло с системами. Передавать состояние транзакции от вызова к вызову внетранзакционными механизмами (а состояние пакета НЕ транзакционно) - крайне плохой дизайн. Не говорю уже, что в случае пула следующий вызов может прилететь вообще в другую сессию. Состояния пакетов используют совершенно иначе. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2021, 15:55 |
|
Mybatis vs Ora-04068
|
|||
---|---|---|---|
#18+
andrey_anonymousКоллеги, буду признателен за ссылки, где можно ознакомиться с указанными заклинаниями. Вот что-то первое попавшееся по Spring AOP . По сути мы говорим что все нужные классы оборачиваются доп логикой (аспектом). Весь остальной код не знает что это вообще происходит, т.е. менять в коде приложения ничего не надо. Правда это очень неявная логика, т.е. если не знаешь что кто-то так настроил, то не всегда догадаешься что что-то такое происходит. А с RetryTemplate мы в конкретном месте кода можем написать "повтори это N раз пока не получится". Вот даже в новом Spring'e такие штуки аннотациями можно настраивать . andrey_anonymousПередавать состояние транзакции от вызова к вызову внетранзакционными механизмами (а состояние пакета НЕ транзакционно) - крайне плохой дизайн. Не говорю уже, что в случае пула следующий вызов может прилететь вообще в другую сессию.Обычно такого не может произойти потому как мы используем одно БД соединение на обработку всего HTTP запроса. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2021, 15:56 |
|
Mybatis vs Ora-04068
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev Когда приложение желает получить чужую DB-сессию из пула, оно должно обнулить состояние - что логично. Вы сами выше писали про пункты должностной инструкции. Попробуйте мысленно представить воплощение своего предложение на более-менее нагруженной системе и оценить время реакции DBA на новый выверт разработчика. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2021, 15:58 |
|
Mybatis vs Ora-04068
|
|||
---|---|---|---|
#18+
Stanislav Bashkyrtsev По сути Премного благодарен. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2021, 15:59 |
|
Mybatis vs Ora-04068
|
|||
---|---|---|---|
#18+
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 - тут со спрингом, но можно и без него прикрутить ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2021, 16:00 |
|
Mybatis vs Ora-04068
|
|||
---|---|---|---|
#18+
andrey_anonymous, Вам уже сказали. Длинная транзакция. Первый запрос ставит состояние в хранимке. Второй запрос переводит деньги. Вклиниваться нельзя. И повторять команду 1 или 2 после райзе тоже нельзя. Вы упрямо твердите что можно. ОК. Возможно юз кейс выше у вас никогда не бывает приказом по части))) ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2021, 16:02 |
|
Mybatis vs Ora-04068
|
|||
---|---|---|---|
#18+
andrey_anonymous Похоже, Вам очень не повезло с системами. Передавать состояние транзакции от вызова к вызову внетранзакционными механизмами (а состояние пакета НЕ транзакционно) - крайне плохой дизайн. При чем тут состояние транзакций, пул соединений? Есть последовательность кода / API: проициализоровать выполнить действие 1 выполнить действие 2 ... выполнить действие 100500 commit хорошо, если это можно обернуть в одну процедуру/анонимный блок, но если бизнес операция сложная, то сделать одной SQL-командной может и не получится (или будет очень громоздко). Разумеется откат/повтор нужен всего блока. Начиная с инициализации andrey_anonymous Состояния пакетов используют совершенно иначе. ? andrey_anonymous Не говорю уже, что в случае пула следующий вызов может прилететь вообще в другую сессию. Так тут проблема не в системе, а неправильного использование пула. Mybatis vs Ora-04068 ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2021, 16:02 |
|
Mybatis vs Ora-04068
|
|||
---|---|---|---|
#18+
andrey_anonymous Leonid Kudryavtsev Когда приложение желает получить чужую DB-сессию из пула, оно должно обнулить состояние - что логично. Вы сами выше писали про пункты должностной инструкции. Попробуйте мысленно представить воплощение своего предложение на более-менее нагруженной системе и оценить время реакции DBA на новый выверт разработчика. DBMS_SESSION.RESET_PACKAGE Какие замечания у DBA ? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2021, 16:04 |
|
Mybatis vs Ora-04068
|
|||
---|---|---|---|
#18+
andrey_anonymous Когллеги, подскажите плиз, какие существуют варианты воткнуть обработку oracle exception ORA-04068 в приложении, использующем MyBatis? Обработка ora-4068, понятно, заключается в повторе вызвавшей сбой операции. Наши джависты вменяемого решения предложить отчего-то не в состоянии - предлагают чуть ли не все вызовы в проекте catch-ами обвешивать. Скорее всего джависты правы. Что такое ORA-0468 ? Код: java 1. 2. 3. 4. 5.
В экшене написано "Try again". Я еще могу предложить синхронно останавливать комплекс приложения вместе с модернизацией PLSQL пакетов. В этом случае Java-приложение всегда будет видеть одинаковое состояние пакетов без перекомпилляций. Но очевидно что кто-то из ваших девопсов оказался хитрее и проигнорировал такую возможность. Сам себя перехитрил. Что можно придумать коробочное на строне приложения чтоб была не нужна перезагрузка? Я не знаю имеет ли Батис шаблон retrier но вот один вариант такого шаблона https://github.com/rholder/guava-retrying Вы можете использовать отдельно на уровне выше батиса. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2021, 16:06 |
|
Mybatis vs Ora-04068
|
|||
---|---|---|---|
#18+
PetroNotC Sharp andrey_anonymous, Вам уже сказали. Длинная транзакция. Первый запрос ставит состояние в хранимке. Второй запрос переводит деньги. На ближайшем code review "гений", сотворивший эту пакость, получит по шапке. Ему будет на пальцах объяснено что такое statement, что есть транзакции, что такое пул соединений и как правильно следует решать такую задачу. Причем правильных решений, в зависимости от деталей процесса, будет предложено несколько - и ни одно из них не будет предполагать передачу информации между вызовами посредством переменных пакета. Коллеги, давайте исходить из того, что в своей области профессиональных знаний я тоже немножко понахватался, за десятки-то лет :) ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2021, 16:22 |
|
Mybatis vs Ora-04068
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev DBMS_SESSION.RESET_PACKAGE Какие замечания у DBA ? Наличие DBMS_SESSION.RESET_PACKAGE в TOP SQL по AWR-отчету. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2021, 16:22 |
|
Mybatis vs Ora-04068
|
|||
---|---|---|---|
#18+
andrey_anonymous Ему будет на пальцах объяснено что такое statement, что есть транзакции, что такое пул соединений и как правильно следует решать такую задачу. Можно тогда нам кратко объяснить, "что такое statement, что есть транзакции" Я всегда предполагал, что транзакция может состоять из множества statement. Поэтому они и называются по разному ))) ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2021, 16:28 |
|
Mybatis vs Ora-04068
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev, Он не знает разницы между физической транзакцией и бизнес транз. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2021, 16:32 |
|
Mybatis vs Ora-04068
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev andrey_anonymous Состояния пакетов используют совершенно иначе. ? Оффтопик тут. Переменные пакета обладают теми же свойствами, что и глобальные переменные . Надо дальше объяснять почему их избегают в логике приложения и как именно это делается? Один из типовых методов использования - самодельное узко специальное кэширование. Типовая реализация - кэш наполняется по факту использования, от сброса кэша логика приложения не страдает. Изредка можно увидеть использование пакетной переменной для управления уровнем логирования, хотя на сегодняшний день это удобнее делать методами условной компиляции или теми же контекстами. Этот вариант тоже не способен причинить приложению попаболь при сбросе состояния. Если же пакету по неким неведомым причинам очень-очень требуется инициализация (на практике не встречал ни разу), то инициализационный код помещают в секцию инициализации пакета. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2021, 16:34 |
|
Mybatis vs Ora-04068
|
|||
---|---|---|---|
#18+
andrey_anonymous, Переменная пакета имеет уровень пакета а не.. Глобальная ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2021, 16:39 |
|
Mybatis vs Ora-04068
|
|||
---|---|---|---|
#18+
andrey_anonymous, Доказывать тут что исспользовать переменные пакета не профессионально это глупость. Сами пакеты нельзя в веб проектах)))) ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2021, 16:42 |
|
Mybatis vs Ora-04068
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev Я всегда предполагал, что транзакция может состоять из множества statement. Поэтому они и называются по разному ))) Вы абсолютно правы. Но если Вам требуется в рамках одной транзакции выполнить несколько statements, то у адекватного программиста передача параметров произойдет на уровне приложения в явном виде. Exception в одном из statement, если, конечно, подлежит обработке, не потребует отката 100500 предыдущих действий указанной транзакции. Если же бизнес-транзакция достаточно сложна и предполагает в своем составе несколько отдельных транзакций БД, то для организации взаимодействия используются совсем иные механизмы - обычно подходящий messaging. Оракель на этот случай предоставляет вполне транзакционный AQ. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2021, 16:44 |
|
Mybatis vs Ora-04068
|
|||
---|---|---|---|
#18+
Веб проект это пул. А пул это анонимный клиент. А он это короткие транзакции без состояния. Это по классике в вузах. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2021, 16:44 |
|
Mybatis vs Ora-04068
|
|||
---|---|---|---|
#18+
PetroNotC Sharp andrey_anonymous, Переменная пакета имеет уровень пакета а не.. Глобальная Вы не в теме. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2021, 16:44 |
|
Mybatis vs Ora-04068
|
|||
---|---|---|---|
#18+
PetroNotC Sharp Сами пакеты нельзя в веб проектах)))) Отчего же? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2021, 16:46 |
|
Mybatis vs Ora-04068
|
|||
---|---|---|---|
#18+
andrey_anonymous, >Exception в одном из statement, если, конечно, подлежит обработке, не потребует отката 100500 предыдущих действий указанной транзакции = У вас ОРМ. Значит не вы отправляете инструкции. И перехватить в нижнем слое проблематично. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2021, 16:47 |
|
Mybatis vs Ora-04068
|
|||
---|---|---|---|
#18+
andrey_anonymous ...Надо дальше объяснять почему их избегают в логике приложения и как именно это делается?... само наличие данного топика, говорит о том, что избежать-то и не получилось ))) andrey_anonymous Один из типовых методов использования - самодельное узко специальное кэширование. Типовая реализация - кэш наполняется по факту использования, от сброса кэша логика приложения не страдает. Типовая?.... ???? Ну и кэш который передается между чужими коннектами (через пул) - это жесть. IMHO Осмысленность кэша на уровне сессии передающейся между чужими коннектами - для меня загадка. Или должна быть на уровне апп сервера (приложения), один на все сессии (т.е. уровнем выше) Или должен быть на уровне одной операции/транзакции/соединения - т.е. не передаваться и очищаться между коннектами. p.s. предлагаю каждому остаться при своем мнение p.p.s. вариантов решений накидали, думаю автор не новичок и не студент, т.ч. сам разбирется, что в его случае проще и лучше Как я понимаю, два принципиальных варианта никто не оспаривает: 1. Организационный. После наката патча/обновления на базу переинициализровать клиентов. 1.1. Жесткий вариант - перезапускать 1.2. Более мягкий вариант (требует программирование, нового API) - "сдувать быстро пул до нулевого размера" 22321026 2. Программный 2.1. Корректно (пере) инициализировать соединение в момент получения из пула 2.2. Реализовывать повтор etc... ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2021, 16:50 |
|
Mybatis vs Ora-04068
|
|||
---|---|---|---|
#18+
andrey_anonymous PetroNotC Sharp Сами пакеты нельзя в веб проектах)))) Отчего же? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2021, 16:50 |
|
Mybatis vs Ora-04068
|
|||
---|---|---|---|
#18+
PetroNotC Sharp andrey_anonymous пропущено... Отчего же? Тема не раскрыта. Даже не оспаривая этот великолепный тезис о сферическом коне, спрошу: как пакет препятствует 22321078 ? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2021, 17:00 |
|
Mybatis vs Ora-04068
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev 1.2. Более мягкий вариант (требует программирование, нового API) - "сдувать быстро пул до нулевого размера" 22321026 Ну вот я имел ввиду именно на уровне конфигурации пула. В пулах в том или ином виде есть настройки: "минимальное количество коннектов" и "сколько времени держать коннект в пуле в случае бездействия". Вот обе настройки в 0. Это конечно не самое хорошее решение, но в определенных жизненных обстоятельствах может снять немного боли. Ну и, возможно, добавить немного боли в будущем :) ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2021, 17:03 |
|
|
start [/forum/topic.php?fid=59&msg=40069703&tid=2120449]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
137ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
others: | 15ms |
total: | 247ms |
0 / 0 |