|
Mybatis vs Ora-04068
|
|||
---|---|---|---|
#18+
Когллеги, подскажите плиз, какие существуют варианты воткнуть обработку oracle exception ORA-04068 в приложении, использующем MyBatis? Обработка ora-4068, понятно, заключается в повторе вызвавшей сбой операции. Наши джависты вменяемого решения предложить отчего-то не в состоянии - предлагают чуть ли не все вызовы в проекте catch-ами обвешивать. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2021, 13:29 |
|
Mybatis vs Ora-04068
|
|||
---|---|---|---|
#18+
IMHO Не допускать таких ситуаций на проде. Не хранить state в пакетах (глобальные переменные) или корректно проводить накат update'ов/upgrade'ов (не допускать invalid package и перекомпилировать в момент update'а/upgrade'а) Обработка ora-4068, понятно, заключается в повторе вызвавшей сбой операции. Совершенно не понятно. Например последовательность вызовов: CSC_CONTEXT_PKG.Initialize( p_object => some_id ); CSC_PROCESS_PKG.Calculate; может вызвать ORA-6508, ORA-04068 на второй операции, а повторять скорее всего нужно все. Т.к. "state of packages" могли стать уже не корректные, а устанавливаются именно в первой операции. Наши джависты вменяемого решения предложить отчего-то не в состоянии - предлагают чуть ли не все вызовы в проекте catch-ами обвешивать. Или реализовать свой helper класс / ф-цию / процедуру (например свой Statement/CallableStatement) и всюду использовать его вместо стандартного. Ну или вообще сделать свой JDBC драйвер с нужным поведением. Сделать можно все, вопрос насколько проблема сильно стоит (сколько денег на решение готовы потратить). IMHO ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2021, 13:50 |
|
Mybatis vs Ora-04068
|
|||
---|---|---|---|
#18+
Ну и вообще-то, если залезть в доку MyBatis тут же находится: https://mybatis.org/mybatis-3/java-api.html ДокаSqlSessionFactory SqlSessionFactory has six methods that are used to create SqlSession instances. In general, the decisions you'll be making when selecting one of these methods are: Transaction: Do you want to use a transaction scope for the session, or use auto-commit (usually means no transaction with most databases and/or JDBC drivers)? Connection: Do you want MyBatis to acquire a Connection from the configured DataSource for you, or do you want to provide your own? Execution : Do you want MyBatis to reuse PreparedStatements and/or batch updates (including inserts and deletes)? ДокаStatement Execution Methods These methods are used to execute SELECT, INSERT, UPDATE and DELETE statements that are defined in your SQL Mapping XML files. They are pretty self explanatory, each takes the ID of the statement and the Parameter Object, which can be a primitive (auto-boxed or wrapper), a JavaBean, a POJO or a Map. <T> T selectOne(String statement, Object parameter) <E> List<E> selectList(String statement, Object parameter) <T> Cursor<T> selectCursor(String statement, Object parameter) <K,V> Map<K,V> selectMap(String statement, Object parameter, String mapKey) int insert(String statement, Object parameter) int update(String statement, Object parameter) int delete(String statement, Object parameter) Хотя не знаю, что проще/универсальнее переопределить. JDBC или MyBatis классы. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2021, 13:56 |
|
Mybatis vs Ora-04068
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev IMHO Не допускать таких ситуаций на проде. Полностью разделяю мнение, что богатым и здоровым быть лучше, чем бедным и больным. В идеальном мире так бы и поступил. Leonid Kudryavtsev корректно проводить накат update'ов/upgrade'ов (не допускать invalid package и перекомпилировать в момент update'а/upgrade'а) Отсутствие invalid package не отменяет warning ora-4068. Leonid Kudryavtsev Например последовательность вызовов: Не актуально, необходимая инициализация производится по требованию. Leonid Kudryavtsev реализовать свой helper класс / ф-цию / процедуру (например свой Statement/CallableStatement) и всюду использовать его вместо стандартного. Ну или вообще сделать свой JDBC драйвер с нужным поведением. Свой драйвер уже рассмотрели, нашли неудобным в плане эксплуатации/поддержки. Вопрос - куда можно включиться в этом самом батике. Если бы приложение работало непосредственно с JDBC, то обернули бы exec-и и на том успоколились. А при батике непонятно. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2021, 14:05 |
|
Mybatis vs Ora-04068
|
|||
---|---|---|---|
#18+
andrey_anonymous Вопрос - куда можно включиться в этом самом батике. Если я правильно понимаю доку, класс для SqlSessionFactory должен задаваться в конфигах. Делаете свою реализацию. Дальше переопределяете/наследуете SqlSession, переопределяете 7 методов для выполнения SQL команд. с MyBatis не работал. Сужу по доке и общей логике "паттерна Factory" ))) ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2021, 14:14 |
|
Mybatis vs Ora-04068
|
|||
---|---|---|---|
#18+
andrey_anonymous Отсутствие invalid package не отменяет warning ora-4068. Я вообще очень редко вижу ora-4068. Обычно ситуации invalid state of package у меня приводят к 6508. Если при накате патчей в базе никого не было (после патча все переподключились) и не было invalid package, то ora-4068 IMHO взятся не откуда. А результат работы и переповторов в процессе наката - все равно не предсказуемо. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2021, 14:19 |
|
Mybatis vs Ora-04068
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev andrey_anonymous Отсутствие invalid package не отменяет warning ora-4068. Я вообще очень редко вижу ora-4068. Накат пакета без остановки приложения (отключения пула коннектов) приводит к 4068 по всем живым сессиям пула, в рамках которых ранее дергался пакет, при обращении к пакету или зависимым от него объектам. За наводку спасибо, парни бодро тыкают мышками, стучат кнопками и размышляют о переопределении defaultSqlSession и executor. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2021, 14:40 |
|
Mybatis vs Ora-04068
|
|||
---|---|---|---|
#18+
andrey_anonymous, Он же верно написал. Не надо допускать таких ситуаций. У вас состояние в сессии. Вы сменили хранимку не отключив клиента. Вы гарантируете что банковская транзакция не сломается? Я бы лечил переконнектом. С откатом текущих. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2021, 14:57 |
|
Mybatis vs Ora-04068
|
|||
---|---|---|---|
#18+
PetroNotC Sharp Вы гарантируете что банковская транзакция не сломается? Гарантирую. Сейчас вообще в моде девопс и накат изменений без перерыва сервиса. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2021, 14:58 |
|
Mybatis vs Ora-04068
|
|||
---|---|---|---|
#18+
Я верно понимаю ситуацию: если у нас есть пакет и мы его обновляем, то все соединения которые его когда-либо использовали, больше не могут его использовать? В такой ситуации кажется что правильней делать версионирование этих пакетов. Т.е. создавать пакет с именем blah2 с обновленной логикой, затем в след релизе наш Java код переходит на новую версию. И после релиза можно удалять прежнюю версию blah1. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2021, 15:04 |
|
Mybatis vs Ora-04068
|
|||
---|---|---|---|
#18+
Stanislav Bashkyrtsev Я верно понимаю ситуацию: если у нас есть пакет и мы его обновляем, то все соединения которые его когда-либо использовали, больше не могут его использовать? Нет. При обновлении пакета сбрасываются переменные определенные в этом пакете (что логично). Соответственно при первом вызове данного пакета в уже существующей сессии, система сообщает, что состояние (переменные) пакета стали некорректны. Логично, что после обновления части софта (базы), желательно софт перезапустить или как минимум переконектится. Но как я понимаю, у топик стартера проблема еще осложняется пуллом коннектов. Мне кажется, что в системах 24x7 должен быть прописан/продуман регламент обновлений и, соответственно, действий после наката обновлений. Решать можно по разному. Подход топик стартера (тупо повторять запросы), костыльный, но вполне вероятно что в его ситуации и работающий. В "общем" он не работает или, как минимум, может работать не корректно. Т.к. повтор SQL команды, не является корректным повтором бизнес операции (бизнес операция может содержать много SQL команд обращающихся ко многим пакетам). IMHO ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2021, 15:15 |
|
Mybatis vs Ora-04068
|
|||
---|---|---|---|
#18+
Stanislav Bashkyrtsev Я верно понимаю ситуацию: если у нас есть пакет и мы его обновляем, то все соединения которые его когда-либо использовали, больше не могут его использовать? Не совсем. Это оракловый exception класса "warning", типовая правильная реакция - простой retry операции за исключением весьма специфических случаев, когда состояние пакета явно инициализируется отдельным вызовом. Предметом обсуждения является не сам exception (если нужны детальные пояснения по ORA-04068, то не проблема, хотя тут оффтопик - лучше идти в оракловую ветку). Предметом обсуждения является "как правильно перехватить и обработать driver-specific exception в ситуации, когда предполагается некая общая реакция для всего приложения". Про различные варианты наката обновлений на прод я и сам могу целую портянку расписать - опыт достаточно богатый. Но - повторюсь - предметом обсуждения является java, MyBatis и точка между батисом и Oracle Jdbc Driver, куда можно культурно врезаться с моей хотелкой. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2021, 15:18 |
|
Mybatis vs Ora-04068
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev В "общем" он не работает или, как минимум, может работать не корректно. "Может работать некорректно" - применительно к приложению, работающему через пул коннектов, это будет очень необычный серверный код. Ну или приложение будет неработоспособно на пуле by design. Больше скажу - как ораклист я наверняка порекомендую коллегам, разработавшим такую систему, альтернативные решения, более подходящие для работы с пулом. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2021, 15:25 |
|
Mybatis vs Ora-04068
|
|||
---|---|---|---|
#18+
andrey_anonymous .... Но - повторюсь - предметом обсуждения является ... точка между батисом и Oracle Jdbc Driver, куда можно культурно врезаться с моей хотелкой. Откровенно говоря, у меня явный когнитивный диссонанс. Автором кристально ясно сформулированна проблема, и им же дан ответ: вариант реализации уже рассмотрели, нашли неудобным в плане эксплуатации/поддержки Даже интересно, что же будет дальше... ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2021, 15:27 |
|
Mybatis vs Ora-04068
|
|||
---|---|---|---|
#18+
andrey_anonymous ...класса "warning"... Можно ссылку на доку с разделением exception на error и warning? ))) Мне кажется, это какой-то вновь придуманный термин. Такое изобретение видел только в Oracle CC&B и жутко на него плевался (т.к. IMHO это бред, прикладные warning'и обрабатывать через exception). В данном случае, это вполне нормальная ошибка. Состояние пакетов поменялось, результат работы (в общем случае) непредсказуем. Если проблема из-за пула коннектов, то наверное проблема в некоректной инициализации коннекта после получения из пула. Почти все пулы, могут настраивать SQL команду, которую нужно дернуть при получении/проверки коннекта на валидность. Наверное можно делать PL/SQL ф-цию Init, которая дернет все пакеты с состояними (переменными) и обнулят данные состояния (переменные), что бы данные между соединениями не утекали (что плохо и с точки зрения секьюрети) в соседние сессии. В общем, мне все же кажется, что проблема не только в коде, но и логическая / организационная. В общем, прежде чем кодировать, "подумать надо" ( C ) IMHO p.s. на одной из пред. работ, программисту прилетел официальный выговор от директора, из-за того, что он написал консультанту/архитектору, что перед тем как делать задачу, хорошо бы "подумать". Выговор был, что архитектор знает свою должностную инструкцию и что ему делать. На что пришли к выводу, что в должностной инструкции на позицию архитектора, пункт "думать" забыли прописать или явно написали "на работе думать запрещается" ))) ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2021, 15:30 |
|
Mybatis vs Ora-04068
|
|||
---|---|---|---|
#18+
booby Даже интересно, что же будет дальше... Текущий статус: andrey_anonymous парни бодро тыкают мышками, стучат кнопками и размышляют о переопределении defaultSqlSession и executor. Однако Леонид четко обозначил, что с батисом не работал. Возможно, в батисе есть подходящее технологическое отверстие и кто-либо из коллег о нем знает/подскажет. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2021, 15:32 |
|
Mybatis vs Ora-04068
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev у топик стартера проблема еще осложняется пуллом коннектов Вообще если вызовы не очень частые, то можно полукостыльное решение: сдувать быстро пул до нулевого размера. Это в общем виде конечно не очень, но при редких вызовах скорее всего быстро решит проблему. В общем виде это только обвешиваться catch-ами. Если не хочется писать их везде, то можно написать свои aspect и навешать на дао-методы. Пишут, что в mybatis есть свои interceptor, но тут надо смотреть применимы ли они в этом случае - смотреть надо ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2021, 15:34 |
|
Mybatis vs Ora-04068
|
|||
---|---|---|---|
#18+
andrey_anonymous Leonid Kudryavtsev В "общем" он не работает или, как минимум, может работать не корректно. "Может работать некорректно" - применительно к приложению, работающему через пул коннектов, это будет очень необычный серверный код.... Совершенно нормальный серверный код. Пример выше привел. Сначала выполняем инициализацию, потом какие-то действия (возможно много и долго) где данные (состояние) установленные этой инициализацией используются. Бизнес операция одна - SQL команд много. Ошибка может возникнуть на любой SQL команде. Правильный повтор - откатить и повторить всю бизнес операцию . Повтор ОДНОЙ SQL команды, в общем случае, является не корректным. В большинстве систем, которые я видел и где использовалось состояние пакектов, бизнес операция очень редко бывает только одной SQL командной. Ради того, что бы передавать данные между разными SQL командами пакетные переменные (состояние) и используют. IMHO & AFAIK Если у Вас бизнес операция == одна команда (процедура, анонимный блок). То повтор наверное будет корректным решением. IMHO ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2021, 15:36 |
|
Mybatis vs Ora-04068
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev, а в должностную инструкцию программиста, видимо забыли вписать наказание за оскорбление вышестоящих руководителей указанием на их недостаточные умственные способности. Самому программисту думать не положено. Пока он думает, он не пишет код, то есть попусту тратит время. Программист должен быть наказуем за любую попытку самостоятельно думать. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2021, 15:36 |
|
Mybatis vs Ora-04068
|
|||
---|---|---|---|
#18+
booby Leonid Kudryavtsev, а в должностную инструкцию программиста, видимо забыли вписать наказание за оскорбление вышестоящих руководителей указанием на их недостаточные умственные способности. Консультанты не являлись вышестоящими руководителями. Т.ч. пошли нафиг. Мало того, общепризнанный (начальством) умственный уровень "среднего" консультанта, общепризнанно был меньше, того же среднего уровня программистов. Т.к. огромная часть консультантов неделю назад институт закончила. Но если у Вас на задачу в Jira "убиться ап стенку", "выпрыгнуть из окна", все программисты дружно начинают ее выполнять - можно только поздравить, отдел HR работает качественно )))) ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2021, 15:41 |
|
Mybatis vs Ora-04068
|
|||
---|---|---|---|
#18+
andrey_anonymous , ок, понятно. Т.е. в принципе как сделать правильно известно, требуется именно хак. Тогда поддержу SpringMan 'a: вместо решения на уровне MyBatis повтор операции можно легко сделать с помощью AOP. Ну а если таких мест мало, то можно с помощью RetryTemplate вставить повтор операции. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2021, 15:44 |
|
Mybatis vs Ora-04068
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev Если проблема из-за пула коннектов, то наверное проблема в некоректной инициализации коннекта после получения из пула. Почти все пулы, могут настраивать SQL команду, которую нужно дернуть при получении/проверки коннекта на валидность. Например в Oracle DBMS_SESSION есть DBMS_SESSION.RESET_PACKAGE https://oracle-base.com/articles/misc/dbms_session#packages Sessions have the ability to alter package state by amending the values of package variables. If a session is being used as part of a connection pool and the state of its packages are not reinitialized, this can lead to unexpected behavior . To solve this, the RESET_PACKAGE procedure, available since Oracle 7, can be called to reinitialize all packages. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2021, 15:45 |
|
Mybatis vs Ora-04068
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev IMHO это бред, прикладные warning'и обрабатывать через exception Оракель слишком древний мамонт, чтобы сделать как-то иначе. Leonid Kudryavtsev В данном случае, это вполне нормальная ошибка. Состояние пакетов поменялось, результат работы (в общем случае) непредсказуем. Я -зачеркнуто- прихожу в изумление, когда любой exception называют ошибкой. С точки зрения вендора случай действительно "общий", и логика генерации исключительной ситуации в данном случае понятна. Но приложение - это всегда частность, и данную исключительную ситуацию надо просто корректно отработать. В данном конкретном случае никакой неопределенности нет и хочется сделать это, не раскидывая по коду ненужные catch. Leonid Kudryavtsev Если проблема из-за пула коннектов, то наверное проблема в некоректной инициализации коннекта после получения из пула. Почти все пулы, могут настраивать SQL команду, которую нужно дернуть при получении/проверки коннекта на валидность. ... Наверное можно делать PL/SQL ф-цию Init эээ... Правильно ли я Вас понял: - когда приложение желает выполнить любой statement (условный "select systimestamp from dual"), оно предварительно должно дернуть специальный метод init, который методами динамического sql (иначе сам вылетит по зависимостям) будет дергать все пакеты, чтобы приложению не пришлось обрабатывать хорошо известный exception? Базист во мне возмущён, традиционно ругается на "этих безумных джавистов" :) ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2021, 15:48 |
|
Mybatis vs Ora-04068
|
|||
---|---|---|---|
#18+
Stanislav Bashkyrtsev andrey_anonymous , ок, понятно. Т.е. в принципе как сделать правильно известно, требуется именно хак. Тогда поддержу SpringMan 'a: вместо решения на уровне MyBatis повтор операции можно легко сделать с помощью AOP. Ну а если таких мест мало, то можно с помощью RetryTemplate вставить повтор операции. Коллеги, буду признателен за ссылки, где можно ознакомиться с указанными заклинаниями. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2021, 15:51 |
|
Mybatis vs Ora-04068
|
|||
---|---|---|---|
#18+
andrey_anonymous эээ... Правильно ли я Вас понял: - когда приложение желает выполнить любой statement.... Нет. Когда приложение желает получить чужую DB-сессию из пула, оно должно обнулить состояние - что логично. Например DBMS_SESSION.RESET_PACKAGE Большинство пулов соединений, которые видел, в настройках позволяли указывать код для инициализации сессии (при получении из пула) и код для проверки валидности сессии (она могла быть закрыта со стороны сервера). Сам с такой проблемой не сталкивался. Т.ч. DBMS_SESSION.RESET_PACKAGE не использовал. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2021, 15:54 |
|
|
start [/forum/topic.php?fid=59&msg=40069614&tid=2120449]: |
0ms |
get settings: |
7ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
215ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 329ms |
0 / 0 |