barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)

суббота, 17 ноября 2012 г.

Java: p6spy или JDBC-logging anywhere

Иногда возникает необходимость трэйсить SQL-запросы к БД в Java-приложении. Если приложение свое (или чужое, но есть доступ к исходникам и возможность их пересобрать) - проблема решается просто:
DriverManager.setLogWriter(writer);
Connection con = DriverManager.getConnection(...);
...
или
DataSource.setLogWriter(writer);
Если доступа к исходникам нет - тут уже все становится сложнее. Предположим, что у нас есть хотя бы доступ к некоторому properties-файлу, в котором задаются параметры JDBC-соединения изучаемого приложения: драйвер, URL и т.п., например:
# The database driver
database.driver = transbase.jdbc.Driver
# The database server or connection string
database.connectionString = jdbc:transbase://localhost:2024/mydb
# Database Login and Password
database.user = iamadmin
...
В таком случае возникает естественная идея - нельзя ли вместо настоящего драйвера подложить какой-нибудь свой, который будет трэйсить запросы и затем отправлять их уже настоящему драйверу БД. Сделать это действительно можно, да и прокси-драйвер такой уже написан. Более того, он является бесплатным (распространяется по Apache Software License). Называется этот драйвер p6spy, доступен для скачки здесь: http://sourceforge.net/projects/p6spy/.
Вот пример подключения p6spy к веб-приложению, развернутому на Tomcat 6:
  1. Качаем с sourceforge файл p6spy-install.jar, распаковываем 
  2. Кладем p6spy.jar в /webapps/<appname>/WEB-INF/lib 
  3. Кладем spy.properties в /webapps/<appname>/WEB-INF/classes
  4. Меняем название драйвера в properties-файле приложения на "com.p6spy.engine.spy.P6SpyDriver" (все остальные параметры подключения не трогаем)
  5. Редактируем spy.properties:
    logfile = D:\spy.log
    excludecategories=
    realdriver=transbase.jdbc.Driver
    Здесь мы задали файл, куда будут писаться логи (я на всякий случай его заранее создал), убрали все исключения из логирования, чтобы в логи писалось абсолютно все, что можно, а также задали имя настоящего драйвера.
  6. Готово, перезагружаем веб-приложение (или томкат целиком), читаем логи =)

Комментариев нет:

Отправить комментарий