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

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和IronTrack SQL进行性能监控

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

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

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

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

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

    P6spy 和 SqlProfiler 打印JDBC真实SQL

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

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

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

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

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

    p6spy dataSource 配置 监听真实sql语句

    p6spy dataSource 配置 监听真实sql语句

    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.jar (内含使用步骤)

    1. **SQL日志记录**:P6Spy 可以捕获并记录应用程序执行的所有SQL语句,包括参数和执行时间,这对于调试和性能分析非常有用。 2. **格式化输出**: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