Java开发人员都知道,通过设置Hibernate属性hibernate.show_sql为true,可以打印出SQL语句用于Debug。但Hibernate输出的SQL都是用占位符‘?’来表示的SQL语句声明,如下,看不到实际执行的参数值:
insert into BILLING_SUM (LAST_ACT_DATE, LAST_ACT_TYP, LAST_ACT_USER, AIR_CODE, AMOUNT, BILLING_SUM_SEQ) values (?, ?, ?, ?, ?, ?)
这样的Show SQL对于Debug来说还是不太方便,无法直观地看到真正执行的SQL是什么。对于这种情况,我们来可借助P6spy这个开源框架来监控SQL语句的执行,作为Hibernate打印语句的有益补充
2002年,开源项目P6spy在SourceForge上发起(http://sourceforge.net/projects/p6spy/),它可以在不改变应用代码的情况下,仅通过配置的方式就可以监控Java应用的SQL语句,记录下任何执行的JDBC SQL。
P6spy的配置非常简单:
- 修改应用的数据源文件,把JDBC Driver替换为P6spy Driver
- 将p6spy.jar包放到classpath下
- 设置spy.properties配置文件,并放到classpath下
1. 修改应用的数据源文件
以JPA的persistence.xml为例,将JDBC Driver设置为com.p6spy.engine.spy.P6SpyDriver
<persistence-unit name="bspGroup1"> <properties> <property name="hibernate.archive.autodetection" value="class" /> <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect" /> <property name="hibernate.connection.driver_class" value="com.p6spy.engine.spy.P6SpyDriver" /> <property name="hibernate.connection.url" value="jdbc:h2:tcp://localhost/R:/test;MODE=Oracle;DB_CLOSE_DELAY=-1;" /> <property name="hibernate.connection.username" value="sa" /> <property name="hibernate.connection.password" value="" /> <property name="hibernate.hbm2ddl.auto" value="update" /> <property name="hibernate.show_sql" value="true" /> <property name="hibernate.format_sql" value="true" /> </properties> </persistence-unit>
2. 将p6spy.jar包放到classpath下
3. 设置spy.properties并放到classpath下
从SourceForge下载的安装程序包中,可以找到spy.properties并在此基础上修改即可。其中主要有以下几个参数配置:
# 设置应用真正使用的JDBC Driver realdriver=org.h2.Driver # 设置使用p6spy driver来做代理 deregisterdrivers=true # 取消JDBC URL前缀,if=true then url must be prefixed with p6spy: useprefix=false # 配置记录Log例外 excludecategories=info,debug,result,batch # 日志输出到控制台 appender=com.p6spy.engine.logging.appender.StdoutLogger
注:详细的spy.properties配置说明,可以参考p6spy安装包下提供的other.htm文档。
附录:
1. P6spy的Maven依赖
<dependency> <groupId>p6spy</groupId> <artifactId>p6spy</artifactId> <version>1.3</version> <scope>test</scope> </dependency>
2. P6spy记录日志格式
Hibernate: insert into BILLING_DETAIL (LAST_ACT_DATE, LAST_ACT_TYP, LAST_ACT_USER, AIR_CODE, AMOUNT, BILLING_DETAIL_SEQ) values (?, ?, ?, ?, ?, ?) [201301-27 01:21:11]|1|0|statement|insert into BILLING_DETAIL (LAST_ACT_DATE, LAST_ACT_TYP, LAST_ACT_USER, AIR_CODE, AMOUNT, BILLING_DETAIL_SEQ) values (?, ?, ?, ?, ?, ?)|insert into BILLING_DETAIL (LAST_ACT_DATE, LAST_ACT_TYP, LAST_ACT_USER, AIR_CODE, AMOUNT, BILLING_DETAIL_SEQ) values ('2013-01-27 01:21:11.226', 'ADD', 'test@iata.org', '555', 1280, 3750) Hibernate: select billingdet0_.BILLING_DETAIL_SEQ as BILLING1_4_, billingdet0_.LAST_ACT_DATE as LAST2_4_, billingdet0_.LAST_ACT_TYP as LAST3_4_, billingdet0_.LAST_ACT_USER as LAST4_4_, billingdet0_.AIR_CODE as AIR5_4_, billingdet0_.AMOUNT as AMOUNT4_ from BILLING_DETAIL billingdet0_ where billingdet0_.AIR_CODE=? [201301-27 01:21:11]|1|0|statement|select billingdet0_.BILLING_DETAIL_SEQ as BILLING1_4_, billingdet0_.LAST_ACT_DATE as LAST2_4_, billingdet0_.LAST_ACT_TYP as LAST3_4_, billingdet0_.LAST_ACT_USER as LAST4_4_, billingdet0_.AIR_CODE as AIR5_4_, billingdet0_.AMOUNT as AMOUNT4_ from BILLING_DETAIL billingdet0_ where billingdet0_.AIR_CODE=?|select billingdet0_.BILLING_DETAIL_SEQ as BILLING1_4_, billingdet0_.LAST_ACT_DATE as LAST2_4_, billingdet0_.LAST_ACT_TYP as LAST3_4_, billingdet0_.LAST_ACT_USER as LAST4_4_, billingdet0_.AIR_CODE as AIR5_4_, billingdet0_.AMOUNT as AMOUNT4_ from BILLING_DETAIL billingdet0_ where billingdet0_.AIR_CODE='781' [201301-27 01:21:11]|-1||resultset|select billingdet0_.BILLING_DETAIL_SEQ as BILLING1_4_, billingdet0_.LAST_ACT_DATE as LAST2_4_, billingdet0_.LAST_ACT_TYP as LAST3_4_, billingdet0_.LAST_ACT_USER as LAST4_4_, billingdet0_.AIR_CODE as AIR5_4_, billingdet0_.AMOUNT as AMOUNT4_ from BILLING_DETAIL billingdet0_ where billingdet0_.AIR_CODE='781'|AIR5_4_ = 781, LAST3_4_ = MOD, LAST4_4_ = yinyj [201301-27 01:21:11]|-1||resultset|select billingdet0_.BILLING_DETAIL_SEQ as BILLING1_4_, billingdet0_.LAST_ACT_DATE as LAST2_4_, billingdet0_.LAST_ACT_TYP as LAST3_4_, billingdet0_.LAST_ACT_USER as LAST4_4_, billingdet0_.AIR_CODE as AIR5_4_, billingdet0_.AMOUNT as AMOUNT4_ from BILLING_DETAIL billingdet0_ where billingdet0_.AIR_CODE='781'|AIR5_4_ = 781, LAST3_4_ = add, LAST4_4_ = aaa
以上输出中包含了Hiberate生成的SQL语句,即以Hiberate:开头。而p6spy记录的日志格式如下:
current time|execution time|category|statement SQL String|effective SQL string
3. spy.properties样例文件
参考附件
4. 如何取消打印SQL
- 设置JPA/Hibernate的show_sql = false
- 将数据源文件中p6spy的JDBC Driver拿掉
5. 监控JBoss4.2数据源JDBC的配置
参见How to trace JDBC statements with JBoss AS:http://www.mastertheboss.com/index.php?option=com_content&task=view&id=259&Itemid=27
相关推荐
P6spy是一个JDBC Driver的包装工具,p6spy通过对JDBC Driver的封装以达到对SQL语句的监听和分析,以达到各种目的。 p6spy的安装步骤: 1. 下载p6spy的安装包 2. 把p6spy的jar包放到Classpath中,如果是WEB App...
p6spy.jar 博文链接:https://lxy19791111.iteye.com/blog/131293
虽然在hibernate中有show_sql选项,但是显示出来的语句大多类似 select * from xxx where value=? 但是有时候我们需要得到完整的SQL语句,怎么办呢?使用P6SPY就可以完成这个任务
通过 P6Spy 我们可以对 SQL 语句进行拦截,相当于一个 SQL 语句的记录器,这样我们可以用它来作相关的分析,比如性能分析。P6Spy 用 Log4J 来记录 JDBC 调用的日记信息。 自从 2003 年 11 月 30 日 P6Spy 版本 1.3 ...
p6spy dataSource 配置 监听真实sql语句
NULL 博文链接:https://hqhe-nj.iteye.com/blog/342372
用 p6spy 来观察 Java 程序中执行的所有 SQL 语句.docx
p6spy简介,p6spy完整显示hibernate的SQL语句 包括参数,spring p6spy 配置
利用P6SPY +SQL Profiler调试、记录、统计web app对数据库的操作, 可以查看到PreparedStatment的执行最终的SQL语句。 有详细的操作说明 下面的这个是集成的完整版。。太大了就不上传了。自己下吧 jahia_v6_...
NULL 博文链接:https://28680360-qq-com.iteye.com/blog/1673095
p6spy是一种可以在控制台上打印出sql语句的工具类,可以和多种数据库交互框架结合在一起,调试程序非常方便
P6spy是一个JDBC Driver的包装工具,p6spy通过对JDBC Driver的封装以达到对SQL语句的监听和分析,以达到各种目的。
用于在tomcat/conf中配置连接数据库驱动。 P6Spy是一个可以用来在应用程序中...通过P6Spy可以对SQL语句进行拦截,相当于一个SQL语句的记录器,这样我们可以用它来作相关的分析,比如性能分析。 此压缩包包含文件和说明
用p6spy来观察Java程序中执行的所有SQL语句[整理].pdf
主要用于打印出执行的sql语句,用来判断程序的正确性。简单使用!
与hibernate配合使用实现sql语句参数的打印及其他的一些性能方面的监控,有利于优化sql代码,用法上网随便一搜很多的
p6psy P6SPY 是一个监控JDBC执行语句的开源产品,利用P6SPY很容易的就能监控到JDBC中执行的SQL语句,便于系统调试和性能调优。 参考:https://blog.csdn.net/weixin_30641567/article/details/90108718
4、使用p6spy 打印出hibernate 中已经替换了占位符参数的sql语句,为hibernate的调试不在感到苦恼 系统部署我使用的ant 部署,代码包含ant部署文件 skyline\coding\src\config\jdbc.properties 为数据库配置...
JDBC-Performance-Logger, 一个JDBC驱动程序包装器和用于分析 性能记录器命令行目测试通过JDBC执行的sql语句的性能。( 点击下面的图片了解这些特性的概况) 为什么还有另一个项目?虽然在JDBC性能监视( log4jdbc,P6...