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

 

虽然在hibernate中有show_sql选项,但是显示出来的语句大多类似
select * from xxx where value=?
但是有时候我们需要得到完整的SQL语句,怎么办呢?使用P6SPY就可以完成这个任务

p6spy是一个开源软件,它可以跟踪任何使用jdbc的应用产生的数据库操作。

特别适合于监控ejb服务器产生的 sql statements。
官方网址:http://www.p6spy.com/
目前p6spy 适用的应用服务器包括jboss, atg, orion, jonas, iplanet, weblogic, websphere, resin and tomcat.

下面我介绍一下p6spy使用SQLServer2005在tomcat应用程序上安装的步骤:
(1)http://www.p6spy.com/download.html,下载zip包
(2)解压出p6spy.jar spy.properties两个文件
(3)将p6spy.jar 放入应用程序的WEB-INF/lib目录,将spy.properties放入WEB-INF/classes目录
(4)修改spy.properties

realdriver=com.microsoft.sqlserver.jdbc.SQLServerDriver
logfile = c:/spy.log 修改一个你需要的日志文件名

 (5)修改hibernate.xml

修改connection.driver_class的值为com.p6spy.engine.spy.P6SpyDriver

或修改spring的配置文件applicationContext.xml

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
  <property name="driverClassName">
    <value>com.microsoft.sqlserver.jdbc.SQLServerDriver</value>
  </property>
  <property name="url">
    <value>jdbc:sqlserver://localhost:1433;databaseName=xxxx;SelectMethod=cursor</value>
  </property>
  <property name="username">
    <value>xxxx</value>
  </property>
  <property name="password">
    <value>xxxx</value>
  </property>
</bean>
<bean id="dataSource4develop" class="com.p6spy.engine.spy.P6DataSource" destroy-method="close">
  <constructor-arg>
    <ref local="dataSource"/> 
  </constructor-arg>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
  <property name="dataSource">
    <ref bean="dataSource4develop"/>
  </property>
</bean>

 (6)重启tomcat
 (7)这样在c:/下的spy.log记录了数据库的访问情况。

 

 

 

如果在你的应用程序启动后,却在 spy.log 文件中发现了如下的提示信息,那就是驱动程序加载先后的问题了。

 

<你的程序的数据库驱动名称> is a real driver in spy.properties, but it has been loaded before p6spy. p6spy will not wrap these connections. Either prevent the driver from loading, or try setting'deregisterdrivers' to true in spy.properties

 

请把 spy.properties 配置文件里的

deregisterdrivers=false

改为

deregisterdrivers=true

,重新运行即可。

这是因为有些应用系统中会先于 P6Spy 加载了真正的数据库的驱动程序,导致 P6Spy 无法监控到,设置

deregisterdrivers

true

,是显式地把真正的数据库的驱动程序进行反注册掉,而采用 P6Spy 的驱动程序。

 

下表列出了 spy.properties 配置文件中的各配置项的名称、默认值及其意义和相关注意事项:

配置项名称 默认值 配置项意义及相关注意事项
module.log com.p6spy.engine.logging. P6LogFactory 用来拦截和记录任务应用程序的 JDBC 语句。若无配置或注释掉则无此功能。
module.outage com.p6spy.engine.outage. P6OutageFactory 检测和记录执行时间比较长的 SQL 语句。若无配置或注释掉则无此功能。
realdriver   真正的应用系统使用的数据库驱动程序名称。
realdriver2   真正的应用系统使用的第二种备用数据库驱动程序名称。
realdriver3   真正的应用系统使用的第三种备用数据库驱动程序名称。
deregisterdrivers false 显示地把真正的数据库的驱动程序进行反注册掉。取值 true| false
executionthreshold   P6Log 模块执行时间设置,整数值 (以毫秒为单位),只有当超过这个时间才进行记录 Log。
outagedetection false P6Outage 模块是否记录较长时间运行的语句。取值 true| false
outagedetectioninterval   P6Outage 模块执行时间设置,整数值 (以秒为单位)),只有当超过这个时间才进行记录 Log。
filter false 是否过滤 Log,取值 true| false
include   过滤 Log 时所包含的表名列表,以逗号分隔。
exclude   过滤 Log 时所排除的表名列表,以逗号分隔。
sqlexpression   过滤 Log 时的 SQL 表达式名称
autoflush true 是否自动刷新。取值 true| false
dateformat   设置时间的格式,也就是用 Java 的 SimpleDateFormat 程序。
includecategories   显示指定过滤 Log 时包含的分类列表,取值为 error,info,batch,debug,statement,commit,rollback,result 的各种组合。
excludecategories   显示指定过滤 Log 时排队的分类列表,取值同上。
stringmatcher   使用正则表达式来过滤 Log,取值为 com.p6spy.engine.common.GnuRegexMatcher 和 com.p6spy.engine.common.JakartaRegexMatcher
stacktrace false 打印堆栈跟踪信息。取值 true| false
stacktraceclass   如果 stacktrace=true,则可以指定具体的类名来进行过滤。
reloadproperties false 监测属性配置文件是否进行重新加载。取值 true| false
reloadpropertiesinterval 60 属性配置文件重新加载的时间间隔,以秒为单位。
useprefix false 是否加上前缀,设置为 true,会加上 p6spy: 作为前缀。取值 true| false
appender com.p6spy.engine.logging. appender.FileLogger 指定 Log 的 appender,与 Log4J 有点同义,取值:com.p6spy.engine.logging.appender.Log4jLogger、com.p6spy.engine.logging.appender.StdoutLogger 和 com.p6spy.engine.logging.appender.FileLogger
logfile spy.log 指定 Log 的文件名,任何适于操作系统的文件。
append true 指定是否每次是增加 Log,设置为 false 则每次都会先进行清空。取值 true| false
log4j.appender.STDOUT org.apache.log4j.ConsoleAppender 当 appender 为 log4j 时采用的配置,配置如同 Log4J 的相关配置。
log4j.appender.STDOUT.layout org.apache.log4j.PatternLayout 同上
log4j.appender.STDOUT. layout.ConversionPattern p6spy - %m%n 同上
log4j.logger.p6spy INFO,STDOUT Log 级别的设置,取值同 Log4J 的配置
realdatasource   设置数据源 DataSource 的配置名称。
realdatasourceclass   设置数据源 DataSource 的类的全称。
realdatasourceproperties   设置数据源 DataSource 的属性,以分号分隔。
jndicontextfactory   设置 JNDI 数据源的 NamingContextFactory。
jndicontextproviderurl   设置 JNDI 数据源的提供者的 URL。
jndicontextcustom   设置 JNDI 数据源的一些定制信息,以分号分隔。

你可能感兴趣的:(sql,log4j,Hibernate,bean,正则表达式)