Иногда возникает необходимость трэйсить 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:
- Качаем с sourceforge файл p6spy-install.jar, распаковываем
- Кладем p6spy.jar в /webapps/<appname>/WEB-INF/lib
- Кладем spy.properties в /webapps/<appname>/WEB-INF/classes
- Меняем название драйвера в properties-файле приложения на "com.p6spy.engine.spy.P6SpyDriver" (все остальные параметры подключения не трогаем)
- Редактируем spy.properties:
logfile = D:\spy.log
excludecategories=
realdriver=transbase.jdbc.DriverЗдесь мы задали файл, куда будут писаться логи (я на всякий случай его заранее создал), убрали все исключения из логирования, чтобы в логи писалось абсолютно все, что можно, а также задали имя настоящего драйвера. - Готово, перезагружаем веб-приложение (или томкат целиком), читаем логи =)
Комментариев нет:
Отправить комментарий