Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3 4 5 6 7 8 9 10 11   вперед  Ctrl      все
 Mybatis vs Ora-04068  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 19232
Когллеги, подскажите плиз, какие существуют варианты воткнуть обработку oracle exception ORA-04068 в приложении, использующем MyBatis?
Обработка ora-4068, понятно, заключается в повторе вызвавшей сбой операции.
Наши джависты вменяемого решения предложить отчего-то не в состоянии - предлагают чуть ли не все вызовы в проекте catch-ами обвешивать.
12 май 21, 13:29    [22320941]     Ответить | Цитировать Сообщить модератору
 Re: Mybatis vs Ora-04068  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9651
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 май 21, 13:50    [22320954]     Ответить | Цитировать Сообщить модератору
 Re: Mybatis vs Ora-04068  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9651
Ну и вообще-то, если залезть в доку 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 май 21, 13:56    [22320955]     Ответить | Цитировать Сообщить модератору
 Re: Mybatis vs Ora-04068  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 19232
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 май 21, 13:57
12 май 21, 14:05    [22320964]     Ответить | Цитировать Сообщить модератору
 Re: Mybatis vs Ora-04068  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9651
andrey_anonymous

Вопрос - куда можно включиться в этом самом батике.

Если я правильно понимаю доку, класс для SqlSessionFactory должен задаваться в конфигах. Делаете свою реализацию.

Дальше переопределяете/наследуете SqlSession, переопределяете 7 методов для выполнения SQL команд.

с MyBatis не работал. Сужу по доке и общей логике "паттерна Factory" )))

Сообщение было отредактировано: 12 май 21, 14:06
12 май 21, 14:14    [22320975]     Ответить | Цитировать Сообщить модератору
 Re: Mybatis vs Ora-04068  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9651
andrey_anonymous

Отсутствие invalid package не отменяет warning ora-4068.

Я вообще очень редко вижу ora-4068. Обычно ситуации invalid state of package у меня приводят к 6508.

Если при накате патчей в базе никого не было (после патча все переподключились) и не было invalid package, то ora-4068 IMHO взятся не откуда.

А результат работы и переповторов в процессе наката - все равно не предсказуемо.
12 май 21, 14:19    [22320980]     Ответить | Цитировать Сообщить модератору
 Re: Mybatis vs Ora-04068  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 19232
Leonid Kudryavtsev
andrey_anonymous

Отсутствие invalid package не отменяет warning ora-4068.

Я вообще очень редко вижу ora-4068.

Накат пакета без остановки приложения (отключения пула коннектов) приводит к 4068 по всем живым сессиям пула, в рамках которых ранее дергался пакет, при обращении к пакету или зависимым от него объектам.

За наводку спасибо, парни бодро тыкают мышками, стучат кнопками и размышляют о переопределении defaultSqlSession и executor.
12 май 21, 14:40    [22320988]     Ответить | Цитировать Сообщить модератору
 Re: Mybatis vs Ora-04068  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8254
andrey_anonymous,
Он же верно написал. Не надо допускать таких ситуаций.
У вас состояние в сессии. Вы сменили хранимку не отключив клиента.
Вы гарантируете что банковская транзакция не сломается?
Я бы лечил переконнектом. С откатом текущих.
12 май 21, 14:57    [22321002]     Ответить | Цитировать Сообщить модератору
 Re: Mybatis vs Ora-04068  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 19232
PetroNotC Sharp
Вы гарантируете что банковская транзакция не сломается?

Гарантирую.
Сейчас вообще в моде девопс и накат изменений без перерыва сервиса.
12 май 21, 14:58    [22321004]     Ответить | Цитировать Сообщить модератору
 Re: Mybatis vs Ora-04068  [new]
Stanislav Bashkyrtsev
Member

Откуда: СПб
Сообщений: 137
Я верно понимаю ситуацию: если у нас есть пакет и мы его обновляем, то все соединения которые его когда-либо использовали, больше не могут его использовать?

В такой ситуации кажется что правильней делать версионирование этих пакетов. Т.е. создавать пакет с именем blah2 с обновленной логикой, затем в след релизе наш Java код переходит на новую версию. И после релиза можно удалять прежнюю версию blah1.
12 май 21, 15:04    [22321008]     Ответить | Цитировать Сообщить модератору
 Re: Mybatis vs Ora-04068  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9651
Stanislav Bashkyrtsev
Я верно понимаю ситуацию: если у нас есть пакет и мы его обновляем, то все соединения которые его когда-либо использовали, больше не могут его использовать?

Нет.

При обновлении пакета сбрасываются переменные определенные в этом пакете (что логично). Соответственно при первом вызове данного пакета в уже существующей сессии, система сообщает, что состояние (переменные) пакета стали некорректны.

Логично, что после обновления части софта (базы), желательно софт перезапустить или как минимум переконектится. Но как я понимаю, у топик стартера проблема еще осложняется пуллом коннектов.

Мне кажется, что в системах 24x7 должен быть прописан/продуман регламент обновлений и, соответственно, действий после наката обновлений. Решать можно по разному. Подход топик стартера (тупо повторять запросы), костыльный, но вполне вероятно что в его ситуации и работающий.

В "общем" он не работает или, как минимум, может работать не корректно. Т.к. повтор SQL команды, не является корректным повтором бизнес операции (бизнес операция может содержать много SQL команд обращающихся ко многим пакетам).

IMHO

Сообщение было отредактировано: 12 май 21, 15:09
12 май 21, 15:15    [22321014]     Ответить | Цитировать Сообщить модератору
 Re: Mybatis vs Ora-04068  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 19232
Stanislav Bashkyrtsev
Я верно понимаю ситуацию: если у нас есть пакет и мы его обновляем, то все соединения которые его когда-либо использовали, больше не могут его использовать?

Не совсем.
Это оракловый exception класса "warning", типовая правильная реакция - простой retry операции за исключением весьма специфических случаев, когда состояние пакета явно инициализируется отдельным вызовом.
Предметом обсуждения является не сам exception (если нужны детальные пояснения по ORA-04068, то не проблема, хотя тут оффтопик - лучше идти в оракловую ветку).
Предметом обсуждения является "как правильно перехватить и обработать driver-specific exception в ситуации, когда предполагается некая общая реакция для всего приложения".
Про различные варианты наката обновлений на прод я и сам могу целую портянку расписать - опыт достаточно богатый.
Но - повторюсь - предметом обсуждения является java, MyBatis и точка между батисом и Oracle Jdbc Driver, куда можно культурно врезаться с моей хотелкой.

Сообщение было отредактировано: 12 май 21, 15:13
12 май 21, 15:18    [22321015]     Ответить | Цитировать Сообщить модератору
 Re: Mybatis vs Ora-04068  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 19232
Leonid Kudryavtsev
В "общем" он не работает или, как минимум, может работать не корректно.

"Может работать некорректно" - применительно к приложению, работающему через пул коннектов, это будет очень необычный серверный код.
Ну или приложение будет неработоспособно на пуле by design.
Больше скажу - как ораклист я наверняка порекомендую коллегам, разработавшим такую систему, альтернативные решения, более подходящие для работы с пулом.

Сообщение было отредактировано: 12 май 21, 15:18
12 май 21, 15:25    [22321017]     Ответить | Цитировать Сообщить модератору
 Re: Mybatis vs Ora-04068  [new]
booby
Member

Откуда:
Сообщений: 2534
andrey_anonymous
....
Но - повторюсь - предметом обсуждения является ... точка между батисом и Oracle Jdbc Driver, куда можно культурно врезаться с моей хотелкой.


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


Даже интересно, что же будет дальше...
12 май 21, 15:27    [22321019]     Ответить | Цитировать Сообщить модератору
 Re: Mybatis vs Ora-04068  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9651
andrey_anonymous
...класса "warning"...

Можно ссылку на доку с разделением exception на error и warning? )))
Мне кажется, это какой-то вновь придуманный термин. Такое изобретение видел только в Oracle CC&B и жутко на него плевался (т.к. IMHO это бред, прикладные warning'и обрабатывать через exception).

В данном случае, это вполне нормальная ошибка. Состояние пакетов поменялось, результат работы (в общем случае) непредсказуем.

Если проблема из-за пула коннектов, то наверное проблема в некоректной инициализации коннекта после получения из пула. Почти все пулы, могут настраивать SQL команду, которую нужно дернуть при получении/проверки коннекта на валидность.

Наверное можно делать PL/SQL ф-цию Init, которая дернет все пакеты с состояними (переменными) и обнулят данные состояния (переменные), что бы данные между соединениями не утекали (что плохо и с точки зрения секьюрети) в соседние сессии.

В общем, мне все же кажется, что проблема не только в коде, но и логическая / организационная. В общем, прежде чем кодировать, "подумать надо" ( C )

IMHO

p.s. на одной из пред. работ, программисту прилетел официальный выговор от директора, из-за того, что он написал консультанту/архитектору, что перед тем как делать задачу, хорошо бы "подумать". Выговор был, что архитектор знает свою должностную инструкцию и что ему делать. На что пришли к выводу, что в должностной инструкции на позицию архитектора, пункт "думать" забыли прописать или явно написали "на работе думать запрещается" )))
12 май 21, 15:30    [22321021]     Ответить | Цитировать Сообщить модератору
 Re: Mybatis vs Ora-04068  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 19232
booby
Даже интересно, что же будет дальше...

Текущий статус:
andrey_anonymous
парни бодро тыкают мышками, стучат кнопками и размышляют о переопределении defaultSqlSession и executor.


Однако Леонид четко обозначил, что с батисом не работал.
Возможно, в батисе есть подходящее технологическое отверстие и кто-либо из коллег о нем знает/подскажет.
12 май 21, 15:32    [22321025]     Ответить | Цитировать Сообщить модератору
 Re: Mybatis vs Ora-04068  [new]
SpringMan
Member

Откуда:
Сообщений: 231
Leonid Kudryavtsev
у топик стартера проблема еще осложняется пуллом коннектов

Вообще если вызовы не очень частые, то можно полукостыльное решение: сдувать быстро пул до нулевого размера. Это в общем виде конечно не очень, но при редких вызовах скорее всего быстро решит проблему.
В общем виде это только обвешиваться catch-ами. Если не хочется писать их везде, то можно написать свои aspect и навешать на дао-методы. Пишут, что в mybatis есть свои interceptor, но тут надо смотреть применимы ли они в этом случае - смотреть надо

Сообщение было отредактировано: 12 май 21, 15:27
12 май 21, 15:34    [22321026]     Ответить | Цитировать Сообщить модератору
 Re: Mybatis vs Ora-04068  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9651
andrey_anonymous
Leonid Kudryavtsev
В "общем" он не работает или, как минимум, может работать не корректно.

"Может работать некорректно" - применительно к приложению, работающему через пул коннектов, это будет очень необычный серверный код....


Совершенно нормальный серверный код.

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

Правильный повтор - откатить и повторить всю бизнес операцию. Повтор ОДНОЙ SQL команды, в общем случае, является не корректным. В большинстве систем, которые я видел и где использовалось состояние пакектов, бизнес операция очень редко бывает только одной SQL командной. Ради того, что бы передавать данные между разными SQL командами пакетные переменные (состояние) и используют. IMHO & AFAIK

Если у Вас бизнес операция == одна команда (процедура, анонимный блок). То повтор наверное будет корректным решением.

IMHO
12 май 21, 15:36    [22321028]     Ответить | Цитировать Сообщить модератору
 Re: Mybatis vs Ora-04068  [new]
booby
Member

Откуда:
Сообщений: 2534
Leonid Kudryavtsev,

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

Самому программисту думать не положено. Пока он думает, он не пишет код, то есть попусту тратит время.
Программист должен быть наказуем за любую попытку самостоятельно думать.
12 май 21, 15:36    [22321029]     Ответить | Цитировать Сообщить модератору
 Re: Mybatis vs Ora-04068  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9651
booby
Leonid Kudryavtsev,

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

Консультанты не являлись вышестоящими руководителями. Т.ч. пошли нафиг.

Мало того, общепризнанный (начальством) умственный уровень "среднего" консультанта, общепризнанно был меньше, того же среднего уровня программистов. Т.к. огромная часть консультантов неделю назад институт закончила.

Но если у Вас на задачу в Jira "убиться ап стенку", "выпрыгнуть из окна", все программисты дружно начинают ее выполнять - можно только поздравить, отдел HR работает качественно ))))
12 май 21, 15:41    [22321031]     Ответить | Цитировать Сообщить модератору
 Re: Mybatis vs Ora-04068  [new]
Stanislav Bashkyrtsev
Member

Откуда: СПб
Сообщений: 137
andrey_anonymous, ок, понятно. Т.е. в принципе как сделать правильно известно, требуется именно хак. Тогда поддержу SpringMan'a: вместо решения на уровне MyBatis повтор операции можно легко сделать с помощью AOP. Ну а если таких мест мало, то можно с помощью RetryTemplate вставить повтор операции.

Сообщение было отредактировано: 12 май 21, 15:37
12 май 21, 15:44    [22321034]     Ответить | Цитировать Сообщить модератору
 Re: Mybatis vs Ora-04068  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9651
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 май 21, 15:37
12 май 21, 15:45    [22321035]     Ответить | Цитировать Сообщить модератору
 Re: Mybatis vs Ora-04068  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 19232
Leonid Kudryavtsev
IMHO это бред, прикладные warning'и обрабатывать через exception

Оракель слишком древний мамонт, чтобы сделать как-то иначе.


Leonid Kudryavtsev
В данном случае, это вполне нормальная ошибка. Состояние пакетов поменялось, результат работы (в общем случае) непредсказуем.
Это вообще не ошибка. Это exception.
Я -зачеркнуто- прихожу в изумление, когда любой exception называют ошибкой.
С точки зрения вендора случай действительно "общий", и логика генерации исключительной ситуации в данном случае понятна.
Но приложение - это всегда частность, и данную исключительную ситуацию надо просто корректно отработать.
В данном конкретном случае никакой неопределенности нет и хочется сделать это, не раскидывая по коду ненужные catch.

Leonid Kudryavtsev

Если проблема из-за пула коннектов, то наверное проблема в некоректной инициализации коннекта после получения из пула. Почти все пулы, могут настраивать SQL команду, которую нужно дернуть при получении/проверки коннекта на валидность.
...
Наверное можно делать PL/SQL ф-цию Init

эээ... Правильно ли я Вас понял:
- когда приложение желает выполнить любой statement (условный "select systimestamp from dual"), оно предварительно должно дернуть специальный метод init, который методами динамического sql (иначе сам вылетит по зависимостям) будет дергать все пакеты, чтобы приложению не пришлось обрабатывать хорошо известный exception?
Базист во мне возмущён, традиционно ругается на "этих безумных джавистов" :)
12 май 21, 15:48    [22321037]     Ответить | Цитировать Сообщить модератору
 Re: Mybatis vs Ora-04068  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 19232
Stanislav Bashkyrtsev
andrey_anonymous, ок, понятно. Т.е. в принципе как сделать правильно известно, требуется именно хак. Тогда поддержу SpringMan'a: вместо решения на уровне MyBatis повтор операции можно легко сделать с помощью AOP. Ну а если таких мест мало, то можно с помощью RetryTemplate вставить повтор операции.

Коллеги, буду признателен за ссылки, где можно ознакомиться с указанными заклинаниями.
12 май 21, 15:51    [22321038]     Ответить | Цитировать Сообщить модератору
 Re: Mybatis vs Ora-04068  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9651
andrey_anonymous

эээ... Правильно ли я Вас понял:
- когда приложение желает выполнить любой statement....


Нет. Когда приложение желает получить чужую DB-сессию из пула, оно должно обнулить состояние - что логично.

Например DBMS_SESSION.RESET_PACKAGE

Большинство пулов соединений, которые видел, в настройках позволяли указывать код для инициализации сессии (при получении из пула) и код для проверки валидности сессии (она могла быть закрыта со стороны сервера).

Сам с такой проблемой не сталкивался. Т.ч. DBMS_SESSION.RESET_PACKAGE не использовал.
12 май 21, 15:54    [22321041]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3 4 5 6 7 8 9 10 11   вперед  Ctrl      все
Все форумы / Java Ответить