Пометка операторов SQL для отслеживания и отладки

У нас есть большое предприятие, состоящее из множества приложений, как старых, так и новых, поддерживаемых Oracle 10G. Когда происходят блокировка сеансов или взаимоблокировки, и мы получаем отчеты о трассировке, было бы очень удобно иметь возможность встроить некоторые детали в sql, чтобы мы знали, какое приложение и, в частности, откуда оно было выполнено. Помимо того, что это помогает ускорить время решения, это может помочь нам найти места, где бизнес-процессы наступают друг на друга. У нас есть несколько мыслей о том, как этого можно достичь, но мне любопытно, решена ли уже эта проблема. Любые мысли или подробности о любых успешных (или иных) попытках будут оценены.


person Sam Reynolds    schedule 22.12.2008    source источник


Ответы (5)


Вы можете пометить куски SQL, выполняемые через Oracle DBMS_APPLICATION_INFO. пакет. Это работает на любом языке приложения, работает внутри самого механизма базы данных и не загромождает ваши операторы SQL комментариями (умные комментарии в любом случае — зло). Что еще более важно, различные инструменты Oracle распознают данные и помогают использовать их при устранении неполадок или настройке.

person Rob Williams    schedule 22.12.2008
comment
Во что бы то ни стало, поощряйте глупые комментарии. - person ; 23.12.2008
comment
умные комментарии это зло? Хм?! - person TheSoftwareJedi; 23.12.2008
comment
умные комментарии в любом случае являются злом — это обобщение и ссылка на многие обсуждения, такие как c2.com/cgi/wiki? Комментарии — это код. - person Rob Williams; 23.12.2008

Мы динамически модифицируем наши операторы SQL, чтобы команда, которая их выполнила, находилась в комментарии в начале запроса. Это работает, потому что мы сами управляем транзакциями и имеем строгие рамки. Но базовый код прост (на Java... не знаю, как с этим справятся другие языки):

String sql = "SELECT * FROM USERS WHERE ID = ?";
Connection con = getConnection();
PreparedStatement ps = con.prepareStatement(getComment() + sql);
// etc

String getComment() {
  return " /* " + getCommandName() + " */ ";
}

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

person Mr. Shiny and New 安宇    schedule 22.12.2008

Properties jdbcProperties = new Properties();

this.jdbcProperties.put("user", userName);
this.jdbcProperties.put("password", password);
this.jdbcProperties.put("v$session.program", "YourApplicationName");
DriverManager.getConnection(url, jdbcProperties);

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

person gokhant    schedule 22.12.2008

«мы знаем, какое приложение и, в частности, откуда оно было выполнено». Вы не упоминаете, на чем написаны ваши приложения. в вашей среде, возможные сроки обновления БД и усилия, связанные с изменениями кода. Если один и тот же SQL выдается из нескольких приложений, он будет (в основном) иметь только одну запись в v$sql, поэтому вы не сможете отследить его до одного приложения.

person Gary Myers    schedule 22.12.2008

Я хотел встроить комментарии в операторы sql, чтобы они были помечены на всем протяжении tkprof (10.2.0.4). Оказалось, что комментарии с косой чертой и двойным дефисом в какой-то момент удаляются. Затем я использовал синтаксис поддельной подсказки sql, которая сохранялась через tkprof, например.

/*+ testrun=4A */  

База данных игнорирует это, и это служит моим потребностям.

person dave    schedule 30.05.2013