#java #oracle #jdbc #jooq
#java #Oracle #jdbc #jooq
Вопрос:
Я работаю над пакетным приложением, в котором DAO layers использует jooq для взаимодействия с базой данных Oracle. Я настроил setClientInfo
соединение с Oracle со всеми необходимыми ключами OCSID. Я использую класс-оболочку, который расширяется DelegatingDataSource
для динамического изменения модуля, действия, ecid и client_id на разных этапах пакетного приложения, например, я устанавливаю action
как имя текущего шага и module
как имя текущего задания и так далее. Я также установил action
с именами процедур.
Я хочу отслеживать по этим показателям, какое задание / шаг / процедура имеет проблемы с производительностью. Я заметил, что во время выполнения пакетного приложения некоторые показатели сохраняются в v$session
таблице. После завершения пакетного приложения я вижу только некоторые записи в V$ACTIVE_SESSION_HISTORY
. Я также пытался перевести процедуры в режим ожидания более чем на 2 минуты, используя APEX_UTIL.PAUSE(120)
но я не могу найти все записи в V$ACTIVE_SESSION_HISTORY
таблице после запуска пакетного приложения. Даже если во время запуска пакетного приложения было более 10-15 вызовов DB, я могу видеть только 3-4 записи в V$ACTIVE_SESSION_HISTORY
. Как эти метрики сохраняются в V$ACTIVE_SESSION_HISTORY
? Как я могу добиться отслеживания производительности в отношении задания / шага / процедуры, используемой в пакетном приложении?
Ответ №1:
Если вы используете свой DataSource
с jOOQ DataSourceConnectionProvider
, jOOQ всегда будет вызывать Connection.close()
в конце каждого оператора, что может, в зависимости от вашей конфигурации, вернуть соединение в пул и, возможно, освободить некоторые ресурсы. Если вы хотите, чтобы ваш «сеанс» длился дольше, убедитесь, что пул соединений не освобождает эти ресурсы, или даже передайте JDBC Connection
в jOOQ вместо DataSource
, в случае чего jOOQ не будет вызывать Connection.close()
. Вы будете.
Возможно, если вас устраивает выборка с более низкой точностью, вас может больше заинтересовать запрос DBA_HIST_ACTIVE_SESS_HISTORY
вместо этого, см.: https://oracle-base.com/articles/10g/active-session-history
Комментарии:
1. Привет, Лукас, спасибо за информацию. Но мне все еще не ясно, как образцы собираются каждую секунду и сохраняются в представлении V $ ACTIVE_SESSION_HISTORY. Рассмотрим пример: у меня есть пакетное приложение, которое работает около 5 минут и за это время выполняет около 10 уникальных вызовов базы данных. Я предполагаю, что после запуска пакета я смогу найти все 10 образцов, собранных либо в V $ ACTIVE_SESSION_HISTORY, либо в DBA_HIST_ACTIVE_SESS_HISTORY? но я могу видеть только некоторые образцы, но не все.
Ответ №2:
Я решил это, удалив APEX_UTIL.PAUSE. Пройдя через этоhttps://jonathanlewis.wordpress.com/2015/03/27/ash я понял, что если сеанс переходит в спящий режим, он будет отображаться в v $ session как status = ‘ACTIVE’ и state = ‘WAITING’, но он не будет записан в v $ active_session_history.