Разработка приложений для DB2: Трассировка с использованием DB2 Universal JDBC Driver

Как выполнить JDBC-трассировку при отсутствии уровня CLI

Трассировка данных, проходящих между приложением и базой данных, предоставляет разработчику информацию для обнаружения программных ошибок и оптимизации доступа к базе данных. DB2® Legacy JDBC™ Driver основан на уровне DB2 Call Level Interface (CLI) и позволяет выполнять JDBC- или CLI-трассировку, изменив конфигурацию CLI. Новый DB2 Universal JDBC Driver больше не основывается на уровне DB2 CLI, поэтому известная функциональная возможность трассировки больше не доступна. Вместо нее DB2 Universal JDBC Driver предлагает возможность трассировки путем установки определенных свойств драйвера. В этой статье сначала рассматривается трассировка, основанная на CLI в DB2 Legacy JDBC Driver, затем - трассировка в новом DB2 Universal JDBC Driver, а также демонстрируется их применение на примере.

Дирк Фехнер, Специалист по IT-службам, IBM Software Group

authorДирк Фехнер (Dirk Fechner) работает специалистом по IT-службам в IBM Software Group. Имеет опыт администрирования и разработки приложений с использованием DB2 UDB на распределенных платформах. Он имеет пятилетний опыт работы с DB2 UDB и является сертифицированным администратором баз данных IBM и сертифицированным разработчиком приложений IBM. В настоящее время осуществляет поддержку администраторов, разработчиков и конечных пользователей в DaimlerChrysler в широком диапазоне тем, связанных с DB2: задачи администрирования, разработка приложений и определение проблем.



09.06.2005

Введение. Зачем нужна JDBC-трассировка?

JDBC-трассировка - это метод обеспечения разработчиков Java-приложений ценной информацией, помогающей при разработке приложений баз данных. Вот примеры ситуаций, когда вы должны знать, как выполнить JDBC-трассировку:

  • Поиск ошибок логики программы или ошибок инициализации - Подключение к базе данных может быть неудачным из-за ошибочного URL: запрос, который уже должен выполниться, вызывается снова и снова, при некорректном определении транзакции может возникнуть несогласованность базы данных и т.д. Во всех этих ситуациях весьма вероятно, что данные трассировки могут быть использованы для обнаружения причины проблемы.
  • Настройка производительности - Проблемы производительности в многоуровневых системах обнаружить не просто, поскольку сначала должен быть определен несущий ответственность за эти проблемы уровень - приложение, сеть или база данных. Анализируя временные метки входа/выхода при вызовах функциях в потоке данных трассировки, вы можете идентифицировать уровень, на котором возникают проблемы производительности.
  • Освоение стороннего программного обеспечения - При использовании стороннего программного обеспечения определение проблемы часто затруднительно, поскольку исходный код недоступен. Поэтому информация трассировки может быть полезна для лучшего понимания того, как это программное обеспечение реализует интерфейс к базе данных.

DB2 Legacy JDBC Driver против DB2 Universal JDBC Driver

DBLegacy JDBC Driver - это драйвер старого типа 2, который был доступен в предыдущих версиях DB2. Он построен на базе DB2 CLI, родного для DB2 интерфейса уровня вызовов С, который и сам был создан на базе нескольких других уровней. Как драйвер типа 2, он требует установки клиентской части DB2. DB2 Legacy JDBC Driver находится в файле db2java.zip.

В DB2 версии 8 начал поставляться новый JDBC-драйвер, так называемый DB2 Universal JDBC Driver. Он был написан полностью заново и спроектирован как абстрактный JDBC-процессор, предоставляющий возможность соединения по типу 2 и типу 4. Приложения выбирают желаемый тип соединения, используя при подключении различный синтаксис URL. DB2 Universal Driver взаимодействует с сервером DB2, используя протокол Distributed Relational Database Architecture (DRDA), и построен на базе уровня Java-клиента, замещающего CLI и несколько более низких уровней. Установка клиента DB2 требуется только для соединения типа 2; типу 4 это не требуется. DB2 Universal JDBC Driver находится в файле db2jcc.jar (JCC - это аббревиатура Java Common Connectivity). И хотя DB2 Legacy Driver все еще поддерживается, он будет полностью заменен драйвером DB2 Universal JDBC Driver в будущем.


Трассировка с использованием DB2 Legacy JDBC Driver Type 2

Основанный на CLI драйвер DB2 Legacy JDBC Driver Type 2 предлагает разработчику приложения два разных варианта трассировки:

  • Трассировка на уровне JDBC - В этом случае трассируются все вызовы JDBC-функций. Трассировочная информация состоит из последовательности вызовов функций, входных и выходных параметров, кодов возврата, а также предупреждений и сообщений об ошибках.
  • Трассировка на уровне CLI - DB2 Legacy JDBC Driver Type 2 внутренне отображает все вызовы JDBC-функций в вызовы CLI-функций. Следовательно, Java-программа, использующая этот драйвер, может активировать трассировку на CLI-уровне. Трассировочная информация является такой же (вызовы функций, параметры, коды возврата и сообщения) но на нижнем уровне CLI.

Оба варианта трассировки управляются через файл инициализации CLI, db2cli.ini. В операционной системе Windows этот файл расположен в каталоге %DB2PATH% (C:\Program Files\IBM\SQLLIB по умолчанию). На системах UNIX/Linux он может быть найден в каталоге $HOME владельца экземпляра в sqllib/cfg.

Для активизации трассировки на уровне JDBC создайте следующие записи в файле db2cli.ini в секции [COMMON]:

Листинг 1. Ключевые слова CLI для JDBC-трассировки
[COMMON]
JDBCTrace=1
JDBCTracePathName=<trace directory>

Может быть указан необязательный параметр JDBCTraceFlush=1. В этом случае каждая трассировочная запись записывается в файл трассировки отдельно, после чего этот файл закрывается и открывается опять. Это гарантирует, что запись о трассировке не будет потеряна, даже если Java-программа потерпит аварию. С другой стороны, этот параметр резко уменьшает производительность.

Поскольку записи в файле db2cli.ini читаются только при первом подключении к базе данных, изменения в файле db2cli.ini не повлияют на существующие соединения с базой данных.

Следующий пример программы может быть использован для тестирования JDBC-трассировки с использованием DB2 Legacy JDBC Driver Type 2. В оставшейся части данной статьи также будет использоваться пример программы для демонстрации возможностей трассировки DB2 Universal JDBC Driver.

Листинг 2. Пример кода для тестирования трассировки Legacy Driver Type 2
public class LegacyTraceExample
{
    public static void main(String[] args) {
        try {
            // загрузить драйвер
            Class.forName("COM.ibm.db2.jdbc.app.DB2Driver").newInstance();

            // установить свойства подключения
            String databaseUrl = "jdbc:db2:sample";

            // получить соединение
            java.sql.Connection con =
                java.sql.DriverManager.getConnection(databaseUrl, "user", "password");

            // выполнить запрос
            java.sql.Statement stmt = con.createStatement();

            String query = "SELECT COUNT(*) FROM SYSCAT.TABLES";
            java.sql.ResultSet rs = stmt.executeQuery(query);

            while (rs.next()) {
                System.out.println("\n" + query + " = " + rs.getInt(1));
            }

            rs.close();
            stmt.close();
            con.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Поскольку пример программы используется только для демонстрации возможностей трассировки, обработка исключительных ситуаций была уменьшена до минимума. Сначала динамически загружается драйвер DB2 Legacy JDBC Driver Type 2. Затем устанавливается соединение с базой данных через менеджер JDBC-драйвера и выполняется простой запрос по таблицам системного каталога.

Следующие записи в файле db2cli.ini создают JDBC-трассировку примера программы в каталоге C:\temp.

Листинг 3. Записи db2.cli для тестирования трассировки с использованием Legacy Driver Type 2
[COMMON]
JDBCTrace=1
JDBCTraceFlush=1
JDBCTracePathName=c:\temp

Трассировка с DB2 Universal JDBC Driver Type 2/Type 4

DBUniversal JDBC Driver больше не основан на уровне DB2 CLI. Это истинно и для инициализации драйвера как типа 4, так и для инициализации драйвера как типа 2. Из-за этого JDBC-трассировка через изменения конфигурации CLI (файл db2cli.ini) больше не возможна. Вместо этого DB2 Universal JDBC Driver разрешает трассировку установкой определенных свойств драйвера.

Когда для доступа к базе данных используется интерфейс DataSource, свойства трассировки могут быть установлены через методы этого интерфейса. Все классы DataSource драйвера DB2 Universal JDBC Driver являются потомками базового класса DB2BaseDataSource, который тоже определяет свойства для трассировки.

Листинг 4. Классы DB2 DataSource
com.ibm.db2.jcc.DB2BaseDataSource
    com.ibm.db2.jcc.DB2SimpleDataSource
    com.ibm.db2.jcc.DB2DataSource
    com.ibm.db2.jcc.DB2ConnectionPoolDataSource
    com.ibm.db2.jcc.DB2XADataSource

В следующих примерах для доступа к базе данных используется DB2SimpleDataSource. Конфигурация для JDBC-трассировки работает одинаково для всех классов DataSource и не зависит от того, какой был выбран тип инициализации DB2 Universal JDBC Driver, 2 или 4.

Следующий пример программы демонстрирует, как JDBC-трассировка может быть активирована при помощи вызова методов, определенных в классе DB2BaseDataSource.

Листинг 5. Пример кода для тестирования трассировки с использованием Universal Driver Type 2/4 (Вариант 1)
public class JccTraceExample1
{
    public static void main(String[] args) {
        try {
            // создать источник данных
            com.ibm.db2.jcc.DB2SimpleDataSource ds =
                new com.ibm.db2.jcc.DB2SimpleDataSource();

            // установить свойства соединения
            ds.setServerName("localhost");
            ds.setPortNumber(50000);
            ds.setDatabaseName("sample");
            ds.setDriverType(4);

            // установить свойства трассировки
            ds.setTraceDirectory("c:\\temp");
            ds.setTraceFile("trace");
            ds.setTraceFileAppend(false);
            ds.setTraceLevel(com.ibm.db2.jcc.DB2BaseDataSource.TRACE_ALL);

            // установить соединение 
            java.sql.Connection con = ds.getConnection("user", "password");

            // выполнить запрос
            java.sql.Statement stmt = con.createStatement();

            String query = "SELECT COUNT(*) FROM SYSCAT.TABLES";
            java.sql.ResultSet rs = stmt.executeQuery(query);

            while (rs.next()) {
                System.out.println("\n" + query + " = " + rs.getInt(1));
            }

            rs.close();
            stmt.close();
            con.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Сначала инициализируется DB2SimpleDataSource для доступа к базе данных, в данном случае как тип 4. Конфигурация JDBC-трассировки выполняется вызовом следующих методов:

  • setTraceDirectory - Определяет каталог, в который записываются файлы трассировки. Если каталог для трассировки определен, для каждого соединения с базой данных создается трассировочный файл. Это рекомендуется потому, что в противном случае данные трассировки для всех соединений с базой данных будут записываться в один трассировочный файл - это сделает анализ трассировочной информации намного более трудным.
  • setTraceFile - Определяет файл, в который записывается трассировочная информация. Если имя этого файла указано в комбинации с каталогом трассировки (как в примере), для каждого соединения с базой данных создается файл трассировки в соответствии со следующим шаблоном: <trace directory>\<trace file>_<data source type>_<sequential number>. В данном примере программы создается файл трассировки c:\temp\trace_sds_0. Если каталог трассировки не указывается, вся трассировочная информация всех соединений с базой данных записывается в указанный файл. В этом случае файл трассировки может указываться с указанием полного пути.
  • setTraceFileAppend - Указывает, перезаписываются ли уже существующие трассировочные файлы.
  • setTraceLevel - Определяет тип информации, которая должна трассироваться. Для этих целей используются константы, определенные в базовом классе DB2BaseDataSource.

Таблица 1. Константы трассировки DB2 JDBC

middlemiddlemiddlemiddlemiddlemiddlemiddlemiddlemiddlemiddlemiddlemiddlemiddlemiddle
Константа трассировкиЗначение Integer
com.ibm.db2.jcc.DB2BaseDataSource.TRACE_NONE0
com.ibm.db2.jcc.DB2BaseDataSource.TRACE_CONNECTION_CALLS1
com.ibm.db2.jcc.DB2BaseDataSource.TRACE_STATEMENT_CALLS2
com.ibm.db2.jcc.DB2BaseDataSource.TRACE_RESULT_SET_CALLS4
com.ibm.db2.jcc.DB2BaseDataSource.TRACE_DRIVER_CONFIGURATION16
com.ibm.db2.jcc.DB2BaseDataSource.TRACE_CONNECTS32
com.ibm.db2.jcc.DB2BaseDataSource.TRACE_DRDA_FLOWS64
com.ibm.db2.jcc.DB2BaseDataSource.TRACE_RESULT_SET_META_DATA128
com.ibm.db2.jcc.DB2BaseDataSource.TRACE_PARAMETER_META_DATA256
com.ibm.db2.jcc.DB2BaseDataSource.TRACE_DIAGNOSTICS512
com.ibm.db2.jcc.DB2BaseDataSource.TRACE_SQLJ1024
com.ibm.db2.jcc.DB2BaseDataSource.TRACE_XA_CALLS2048
com.ibm.db2.jcc.DB2BaseDataSource.TRACE_ALL-1

В примере программы собирается вся трассировочная информация (com.ibm.db2.jcc.DB2BaseDataSource.TRACE_ALL). Если вы хотите трассировать только определенную информацию, то можете комбинировать константы трассировки при помощи оператора OR (например,
com.ibm.db2.jcc.DB2BaseDataSource.TRACE_STATEMENT_CALLS |
com.ibm.db2.jcc.DB2BaseDataSource.TRACE_RESULT_SET_CALLS).

Этот тип трассировки может быть немного проблематичным, поскольку он требует изменений исходного кода, что нежелательно при любых обстоятельствах. Когда источник данных определяется отдельно от исходного кода, что верно при использовании такого сервера приложений как WebSphere, свойства трассировки могут быть указаны вместе с определением Data Source. Это позволяет активировать/деактивировать трассировку без изменений исходного кода. Дополнительную информацию по этой теме можно найти в следующем техническом документе:

Разрешение трассировки DB2 Universal JDBC Driver (JCC) на сервере WebSphere Application Server V5

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

Листинг 6. Пример кода для тестирования трассировки с использованием Universal Driver Type 2/4 (Вариант 2)
public class JccTraceExample2
{
    public static void main(String[] args) {
        try {
            // создать источник данных
            com.ibm.db2.jcc.DB2SimpleDataSource ds =
                new com.ibm.db2.jcc.DB2SimpleDataSource();

            // установить свойства соединения
            ds.setServerName("localhost");
            ds.setPortNumber(50000);
            ds.setDatabaseName("sample");
            ds.setDriverType(4);

            // установить соединение
            java.sql.Connection con = ds.getConnection("user", "password");

            // выполнить запрос
            java.sql.Statement stmt = con.createStatement();

            String query = "SELECT COUNT(*) FROM SYSCAT.TABLES";
            java.sql.ResultSet rs = stmt.executeQuery(query);

            while (rs.next()) {
                System.out.println("\n" + query + " = " + rs.getInt(1));
            }

            rs.close();
            stmt.close();
            con.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

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

Листинг 7. Свойства трассировки DB2 JDBC
db2.jcc.traceDirectory=c:\\temp
db2.jcc.traceFile=trace
db2.jcc.traceFileAppend=false
db2.jcc.traceLevel=-1

Для этого конфигурационного файла нет соглашений по наименованию. Имя файла указывается через опцию –D при выполнении Java-программы. Например, если конфигурационный файл называется jcc.properties, вызов программы может выглядеть следующим образом.

Листинг 8. Файл свойств трассировки DB2 JDBC
java -Ddb2.jcc.propertiesFile=jcc.properties JccTraceExample2

В этом случае конфигурационный файл размещается в том же каталоге, что и файл Java-классов. В противном случае может быть указан полный путь к конфигурационному файлу.

Если используется конфигурационный файл, уровень трассировки не может быть указан в виде константы, вместо этого должно использоваться целое значение, например -1 для TRACE_ALL или 6 для TRACE_STATEMENT_CALLS | TRACE_RESULT_SET_CALLS (в этом случае значение просто добавляются = 2 + 4).

Поскольку свойства конфигурационного файла не ограничены конкретным источником данных, они автоматически относятся ко всем источникам данных. Следовательно, генерируемое имя файла трассировки отличается от приведенного выше примера. Если указаны каталог трассировки и файл трассировки, для каждого соединения к базе данных создается файл, имя которого соответствует следующему шаблону: <trace directory>\<trace file>_global_<sequential number>. Для примера программы создается файл трассировки c:\temp\trace_global_0.

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

Листинг 9. Пример переопределения свойств трассировки
db2.jcc.override.traceDirectory=c:\\temp
db2.jcc.override.traceFile=trace
db2.jcc.override.traceFileAppend=false
db2.jcc.override.traceLevel=-1

Варианты трассировки при использования DB2 Universal JDBC Driver

Вместо Data Source для установки соединения с базой данных может быть также использован интерфейс DriverManager. В этом случае свойства трассировки могут быть указаны как дополнение к URL базы данных.

Листинг 10. Пример кода для тестирования трассировки с использованием Universal Driver Type 2/4 (Variant 3)
public class JccTraceExample3
{
    public static void main(String[] args) {
        try {
            // загрузить драйвер
            Class.forName("com.ibm.db2.jcc.DB2Driver").newInstance();

            // установить свойства соединения
            String databaseUrl = "jdbc:db2://localhost:50000/sample"
                                 + ":traceDirectory=c:\\temp"
                                 + ";traceFile=trace"
                                 + ";traceFileAppend=false"
                                 + ";traceLevel="
                                 + com.ibm.db2.jcc.DB2BaseDataSource.TRACE_ALL
                                 + ";";

            // установить соединение
            java.sql.Connection con =
                java.sql.DriverManager.getConnection(databaseUrl, "user", "password");

            // выполнить запрос
            java.sql.Statement stmt = con.createStatement();

            String query = "SELECT COUNT(*) FROM SYSCAT.TABLES";
            java.sql.ResultSet rs = stmt.executeQuery(query);

            while (rs.next()) {
                System.out.println("\n" + query + " = " + rs.getInt(1));
            }

            rs.close();
            stmt.close();
            con.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Если указаны каталог и файл трассировки, для каждого соединения с базой данных создается трассировочный файл с именем, соответствующим следующему шаблону: <trace directory>\<trace file>_driver_<sequential number>. Для нашего примера программы создается трассировочный файл c:\temp\trace_driver_0.

Как альтернатива, трассировочная информация может быть перенаправлена в PrintWriter. В этом случае трассировка активируется вызовом метода setJccLogWriter класса com.ibm.db2.jcc.DB2Connection. В качестве параметров метод ожидает указания используемого PrintWriter и уровня трассировки.

Листинг 11. Пример кода для тестирования трассировки с использованием Universal Driver Type 2/4 (Вариант 4)
public class JccTraceExample4
{
    public static void main(String[] args) {
        try {
            // создать print writer
            java.io.PrintWriter printWriter = new java.io.PrintWriter(
                new java.io.BufferedOutputStream(
                    new java.io.FileOutputStream("c:\\temp\\trace.txt"), 4096), true);

            // создать источник данных
            com.ibm.db2.jcc.DB2SimpleDataSource ds =
                new com.ibm.db2.jcc.DB2SimpleDataSource();

            // установить свойства соединения
            ds.setServerName("localhost");
            ds.setPortNumber(50000);
            ds.setDatabaseName("sample");
            ds.setDriverType(4);

            // установить соединение 
            java.sql.Connection con = ds.getConnection("user", "password");

            // активировать трассировку
            ((com.ibm.db2.jcc.DB2Connection) con).setJccLogWriter(printWriter,
                com.ibm.db2.jcc.DB2BaseDataSource.TRACE_ALL);

            // выполнить запрос 
            java.sql.Statement stmt = con.createStatement();

            String query = "SELECT COUNT(*) FROM SYSCAT.TABLES";
            java.sql.ResultSet rs = stmt.executeQuery(query);

            while (rs.next()) {
                System.out.println("\n" + query + " = " + rs.getInt(1));
            }

            rs.close();
            stmt.close();
            con.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Благодарности

Я хотел бы поблагодарить Питера Шурра (Peter Schurr) за предварительное прочтение этой статьи.


Загрузка

ОписаниеИмяРазмер
DB2 Universal JDBC Driver trace samplesdb2jcc_trace_samples.zip  ( HTTP | FTP | Download Director Помощь )4 KB

Ресурсы

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Information Management, Технология Java
ArticleID=97365
ArticleTitle=Разработка приложений для DB2: Трассировка с использованием DB2 Universal JDBC Driver
publish-date=06092005