Пометка SQL-операторов для трассировки и отладки - PullRequest
0 голосов
/ 22 декабря 2008

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

Ответы [ 5 ]

2 голосов
/ 22 декабря 2008

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

0 голосов
/ 30 мая 2013

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

/*+ testrun=4A */  

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

0 голосов
/ 23 декабря 2008

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

0 голосов
/ 23 декабря 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, сгруппировавшись по столбцу программы для ваших соединений, это просто ..

0 голосов
/ 22 декабря 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 с нашим собственным объектом соединения, так что этот код присутствует, даже если люди программируют против экземпляра соединения без обработки, вместо использования методов дружественного помощника, которые мы обычно используем.

...