`
yyjlinux
  • 浏览: 371085 次
  • 来自: ...
社区版块
存档分类
最新评论

P6spy监控打印SQL语句

 
阅读更多

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的配置非常简单:

  1. 修改应用的数据源文件,把JDBC Driver替换为P6spy Driver
  2. 将p6spy.jar包放到classpath下
  3. 设置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 AShttp://www.mastertheboss.com/index.php?option=com_content&task=view&id=259&Itemid=27

分享到:
评论

相关推荐

    P6SPY JDBC拦截打印sql语句 非常好的调试工具

    P6spy是一个JDBC Driver的包装工具,p6spy通过对JDBC Driver的封装以达到对SQL语句的监听和分析,以达到各种目的。 p6spy的安装步骤: 1. 下载p6spy的安装包 2. 把p6spy的jar包放到Classpath中,如果是WEB App...

    采用p6spy完整显示hibernate的SQL语句

    P6Spy是一个开源的JDBC代理库,它允许我们监控并记录应用通过JDBC执行的所有数据库操作,包括那些由Hibernate生成的SQL语句。它不仅可以提供完整的SQL语句,还能够提供执行时间、性能指标等详细信息,这对于优化...

    使用P6spy打印ibatis执行的SQL语句

    本文将详细探讨如何使用P6Spy来打印iBatis(现为MyBatis)执行的SQL语句,以便进行性能分析和调试。 首先,我们需要了解P6Spy的工作原理。P6Spy通过替换JDBC驱动,将自己插入到应用程序和数据库之间,监听所有的SQL...

    p6spy-sql监控

    **P6Spy SQL监控工具详解** ...总结来说,P6Spy是一个强大的SQL监控工具,它能够帮助我们更好地理解数据库性能、优化SQL语句以及保障数据安全。正确配置和使用P6Spy,可以显著提升Java应用程序的数据库管理效率。

    借鉴p6spy,实现自己的SQL执行监控器项目源代码

    P6Spy是一个广泛使用的开源框架,它允许开发者无侵入地监控和记录应用程序中的所有SQL语句。这个项目的目标是借鉴P6Spy的部分源码,创建一个自定义的SQL执行监控器,以满足特定的需求或提供更定制化的功能。 P6Spy...

    使用P6Spy和IronTrack SQL进行性能监控

    P6Spy通过拦截并记录SQL语句,为开发者提供了一种无侵入式的监控解决方案。它的工作原理是在JDBC驱动层插入一个代理,所有数据库访问请求都会经过这个代理,因此可以捕获到所有的SQL操作。P6Spy的配置相对简单,只...

    使用p6spy完整显示hibernate的SQL语句

    `p6spy`是一个非常实用的开源工具,它能够帮助我们监控和记录应用通过JDBC执行的所有SQL语句。这篇博客“使用p6spy完整显示hibernate的SQL语句”可能详细解释了如何配置和使用p6spy来跟踪Hibernate生成并执行的SQL。...

    P6spy 和 SqlProfiler 打印JDBC真实SQL

    然而,为了优化数据库性能、排查问题,我们往往需要监控和分析应用程序执行的SQL语句。这就引入了两个强大的工具——P6Spy和SqlProfiler,它们专门用于打印和分析JDBC执行的真实SQL。 P6Spy是一个开源的Java库,...

    下载 p6spy.jar (内含使用步骤)

    1. **SQL日志记录**:P6Spy 可以捕获并记录应用程序执行的所有SQL语句,包括参数和执行时间,这对于调试和性能分析非常有用。 2. **格式化输出**:P6Spy 提供了自定义的日志格式,可以按照开发者的需求定制输出信息...

    用 p6spy 来观察 Java 程序中执行的所有 SQL 语句.docx

    p6spy 是一个开源的 Java 框架,它的主要功能是在不修改代码的情况下,监控和记录 Java 应用程序中执行的所有 SQL 语句。这个工具对于开发者来说非常有用,因为它可以帮助定位性能瓶颈,特别是在使用 ORM(对象关系...

    p6spy dataSource 配置 监听真实sql语句

    p6spy dataSource 配置 监听真实sql语句

    P6Spy 提供数据库性能监控和剖析工具

    通过 P6Spy 我们可以对 SQL 语句进行拦截,相当于一个 SQL 语句的记录器,这样我们可以用它来作相关的分析,比如性能分析。P6Spy 用 Log4J 来记录 JDBC 调用的日记信息。 自从 2003 年 11 月 30 日 P6Spy 版本 1.3 ...

    weblogic server 11g +p6spy +sql profiler 配置

    P6Spy则是一个开源的数据库监控工具,它能够帮助开发者和管理员追踪和分析SQL执行情况,提高数据库性能。SQL Profiler是P6Spy的一个组件,用于对数据库操作进行详细分析,找出潜在的性能瓶颈。 配置WebLogic Server...

    p6spy.rar输出完整带参sql

    标题中提到的“输出完整SQL”,意味着P6Spy可以捕获并记录应用程序发出的所有SQL语句,包括参数。这对于调试和性能分析非常有用,特别是当SQL语句是动态生成或者使用了预编译的PreparedStatement时。 5. **兼容性*...

    Tomcat6.x + P6spy + SqlProfiler集成

    - 通过P6spy收集的日志信息,你可以将这些SQL语句导入到SqlProfiler中进行更深入的分析。 4. **测试与调试** - 启动Tomcat,运行应用程序,进行数据库操作。 - 检查P6spy的日志文件,查看SQL语句的执行情况。 -...

    p6spy精简版-跟踪sql工具

    【p6spy精简版-跟踪SQL工具】是一款专为数据库操作监控设计的工具,它通过对JDBC驱动的拦截,实现对SQL语句的透明跟踪。这个精简版旨在简化p6spy的原生配置和使用流程,让更多非开发人员也能便捷地利用此工具来监控...

    p6spy java 使用

    一旦启用 P6Spy,每次应用程序执行 SQL 语句时,P6Spy 都会记录这些 SQL 的详细信息,包括执行前后的原始 SQL、执行参数、返回结果以及执行时间等,这对于性能调优和问题排查非常有用。 【排除ResultSet】 P6Spy ...

    sqlprofiler+p6spy+配制

    同时,将SQL Profiler和P6Spy结合使用,可以提供更全面的数据库性能监控视图。在Java应用中,P6Spy可以捕获和记录所有的SQL请求,而SQL Profiler则可以在服务器端提供更详细的事件追踪。这种组合可以提供从客户端到...

    p6spy简介显示hibernate配置

    1. **SQL日志记录**:P6Spy能够捕获并记录应用程序执行的所有SQL语句,包括参数值,这对于分析SQL性能和定位问题非常有价值。 2. **格式化输出**:P6Spy可以按照自定义的格式输出SQL日志,使其更易于阅读和分析。 ...

    p6spy_sqlprofiler-0.3-bin.zip

    它的工作原理是在数据库连接驱动层插入一个代理,使得所有的SQL语句在执行前都会经过P6Spy的处理。通过配置文件`spy.properties`,我们可以定制日志格式和内容,以便分析数据库性能。 在P6Spy的基础上,SQLProfiler...

Global site tag (gtag.js) - Google Analytics