Oracle сквозные метрики с Jooq

#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.