Pages

Monday, April 22, 2013

P6Spy - Log SQL statements along with Parameter Values [ Liferay & Hibernate ]


Description

P6Spy is a framework that enables database data to be seamlessly intercepted and manipulated with no code changes to existing application. The P6Spy distribution includes P6Log, an application which logs all JDBC transactions for any Java application us.

P6Spy official  site : http://sourceforge.net/projects/p6spy/

--> Hiểu đơn giản P6Spy là một framework cho phép chúng ta log toàn bộ JDBC Transactions trong ứng dụng mà không phải đưa thêm/thay đổi bất kỳ dòng code nào vào trong ứng dụng -> việc log hoàn toàn độc lập với ứng dụng. 
--> P6Spy không chỉ log các SQL Statement (  Trong JDBC tạo ra các Statement là câu query với các dấu  ? , mỗi dấu ? đại diện cho một tham số ) mà nó cho phép log toàn bộ các Parameter Values đã được pass vào, tức là câu SQL hoàn chính với giá trị của param sẽ thực hiện cuối cùng với DB. 

==> Rất tiện lợi cho mục đích debug. 

Một ví dụ khi  một Statement được log : 
SELECT COUNT(*) AS COUNT_VALUE
FROM Users_Roles WHERE userId = ? AND roleId = ?
Note :  với Hibernate thiết lập  show_sql  property  là true để show ra các câu SQL . 

--> Với P6Spy nó còn cho phép biết được các giá trị của các dấu ? là gì . 
1366824587058|1|1|statement|SELECT COUNT(*) AS COUNT_VALUE FROM Users_Roles WHERE userId = ? AND roleId = ? 
|SELECT COUNT(*) AS COUNT_VALUE FROM Users_Roles WHERE userId = '10195' AND roleId = '10163'

Tích hợp P6Spy trong liferay [ Hibernate]


Liferay sử dụng hibernate, do vậy  việc tích hợp p6spy là khá tương đồng. 

1. download file p6spy-install.jar từ http://sourceforge.net/projects/p6spy/
--> thực hiện giải nén và lấy hai file : p6spy.jar và spy.properties 
sử dụng lastest version  1.3 ( modified 2003-12-01)

2. copy p6spy.jar  vào thư mục lib của server,
ví dụ với tomcat  tôi copy vào : liferay-portal-6.1.1-ce-ga2\tomcat-7.0.27\lib\ext
Note : trong thư mục giải nén có chứa cả guide --> có thể tham khảo cho các server khác nhau.

3. Đưa file spy.properties vào ClassPath.
file spy.properties chứa các thông tin cấu hình cho p6spy. để p6spy có thể đọc được thì ta cần đưa nó vào classpath. 
ta có hai cách: 
-- các đơn gian là đặt nó vào root folder của project: với liferay tôi copy nó vào :\liferay-portal-6.1.1-ce-ga2\tomcat-7.0.27\webapps\ROOT\WEB-INF\classes
==> nó được load tương tự các file portal-*.properties  hay service-*.properties.
-- các hai là thiết lập   -Dp6.home   vào JAVA_OPTS  để chỉ ra folder chứa file spy.properties. 
ví dụ với tomcat trên window  --> tìm vào thêm dòng in đậm với đường dẫn thích hợp trên máy của bạn 
  .....\liferay-portal-6.1.1-ce-ga2\tomcat-7.0.27\bin\setenv.bat

set "JAVA_OPTS=%JAVA_OPTS%  -Dp6.home=D:/apps/liferay/liferay-portal-tomcat-6.1/liferay-portal-6.1.1-ce-ga2/tomcat-7.0.27/lib/ext 
 -Dfile.encoding=UTF8 -Djava.net.preferIPv4Stack=true -Dorg.apache.catalina.loader.WebappClassLoader.ENABLE_CLEAR_REFERENCES=false -Duser.timezone=GMT -Xmx1024m -XX:MaxPermSize=256m"

4. edit spy.properties 
- Có một property bắt buộc cần edit đó là : realdriver  --> tương ứng với driver của db bạn đang connect tới
ví dụ  với MYSQL: 
# mysql Connector/J driver
 realdriver=com.mysql.jdbc.Driver
- thuộc tính thứ hai cần lưu ý  là  chỉ ra vị trí của  file log
ví dụ  : 
logfile     = D:/apps/liferay/liferay-portal-tomcat-6.1/liferay-portal-6.1.1-ce-ga2/tomcat-7.0.27/logs/spy.log

-  thuộc tính khác là : log4j.logger.p6spy  chỉ ra Level được log 
ví dụ log4j.logger.p6spy=INFO,STDOUT

5. Cầu hình JDBC trong portal-ext.properties với driver class là P6SpyDriver class của p6spy.
jdbc.default.driverClassName=com.p6spy.engine.spy.P6SpyDriver
jdbc.default.username=root
jdbc.default.url=jdbc:mysql://localhost/lportal?useUnicode=true&characterEncoding=UTF-8&useFastDateParsing=false
#
# Set other miscellaneous Hibernate properties.
#
hibernate.show_sql=true

final : Run server và tay sẽ thấy file  spy.log tương ứng ở vị trí đã config khi thực hiện các query thì chúng sẽ được log tại đây. Điều chính Log Level cho phù hợp với mục địch.

Lưu ý : việc tích hợp p6spy giảm thiểu tối đa thời gian cho việc debug, và sử dụng nó trong môi develop, khi ứng dụng được triển khai trên môi trường product thì cần loại bỏ  p6spy.
---------------------------------------------------------------------------------------------------------

Một số framework khác

LOG4JDBC

https://code.google.com/p/log4jdbc/
JDBC proxy driver for logging SQL and other interesting information.
log4jdbc is a Java JDBC driver that can log SQL and/or JDBC calls (and optionally SQL timing information) for other JDBC drivers using theSimple Logging Facade For Java (SLF4J) logging system.
2012-02-17: log4jdbc 1.2 final release! (It's about time, huh?) Full changelist here.

JDBC SQL Profiler

http://sourceforge.net/projects/sqlprofiler/?source=recommended
Description
Have you ever wondered which database indexes you should create for your JDBC-based application ? This Swing-based SQL profiler tries to offer a tool to monitor which tables and columns are accessed the most in SQL queries to recommend index creation

JDBC Logger

http://sourceforge.net/projects/jdbclogger/?source=recommended
Description
jdbclogger is a Java tool that intercepts and logs all database statements that use JDBC.
JDBC Logger Web Site

Elvyx

http://sourceforge.net/projects/elvyx/?source=recommended
Description
Elvyx is a tool designed to monitor and profile the jdbc activity on java projects. This jdbc profiler has a server with a built-in db and a client to improve the experience.


No comments:

Post a Comment