Hibernate 显示完整SQL语句

使用hibernate时,想显示sql语句,可以设置show_sql为true来达到这个目的,但是参数值全是像PreparedStatement一样,用?来代替的。
用p6spy可以达到显示的那些参数原值的目的,但可读性差。可以利用SQL Profiler来处理这个事情。
p6spy: http://www.p6spy.com
SQL Profile:http://sourceforge.net/projects/sqlprofiler/

一、下载p6spy-install.zip

    官方:http://www.p6spy.com/

    解压:p6spy-install.zip,

    把根目录下的p7spy.jar 复制到 WEB-INF\lib\下,

    spy.properties 复制到 WEB-INF\classes\下

二、修改spy.properties文件

    开启42行

    # oracle driver
    realdriver=oracle.jdbc.driver.OracleDriver

    关闭54行     
    # the mysql open source driver
    #realdriver=org.gjt.mm.mysql.Driver

    修改168行,日志存放位置

    logfile = c:/spy.log

三、修改spring配置文件

<bean id="loadPropertiesConfigure" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  <property name="location">
  <value>classpath:connectionPool.properties</value>  
  </property>
 </bean>

   <bean id="proxoolDataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource">
  <property name="alias">
  <value>${proxool.alias}</value>
  </property>
  <property name="driver">
  <value>${proxool.driver}</value>
  </property>
  <property name="driverUrl">
  <value>${proxool.url}</value>
  </property>
  <property name="user">
  <value>${proxool.username}</value>
  </property>
  <property name="password">
  <value>${proxool.password}</value>
  </property>
  <property name="minimumConnectionCount">
  <value>${proxool.minimumConnectionCount}</value>
  </property>
  <property name="maximumConnectionCount">
  <value>${proxool.maximumConnectionCount}</value>
  </property>
  <property name="prototypeCount">
  <value>${proxool.prototypeCount}</value>
  </property>
  <property name="simultaneousBuildThrottle">
  <value>${proxool.simultaneousBuildThrottle}</value>
  </property>
  <property name="maximumActiveTime">
  <value>${proxool.maximumActiveTime}</value>
  </property>
  <!-- 以下两个参数修改了源码才有效 -->
  <property name="houseKeepingSleepTime">
  <value>${proxool.houseKeepingSleepTime}</value>
  </property>
  <property name="maximumConnectionLifetime">
  <value>${proxool.maximumConnectionLifetime}</value>
  </property>
  <property name="trace">
  <value>${proxool.trace}</value>
  </property>
  <property name="verbose">
  <value>${proxool.verbose}</value>
  </property>  
  <property name="statistics">
  <value>${proxool.statistics}</value>
  </property>
  <property name="statisticsLogLevel">
  <value>${proxool.statisticsLogLevel}</value>
  </property>
  <property name="testBeforeUse">
  <value>${proxool.testAfterUse}</value>
  </property>
  <property name="testAfterUse">
  <value>${proxool.testAfterUse}</value>
  </property>
  <property name="houseKeepingTestSql">
  <value>${proxool.houseKeepingTestSql}</value>
  </property>  
 </bean>
 <!-- sql监控 -->
 <bean id="dataSource" class="com.p6spy.engine.spy.P6DataSource" >
  <constructor-arg>
  <ref local="proxoolDataSource"/>
  </constructor-arg>
 </bean>

  <!-- 定义Hibernate的一个sessionFactory -->
  <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" scope="singleton">
  <property name="dataSource">
  <!-- <ref bean="proxoolDataSource"/> -->
  <ref bean="dataSource"/>  
  </property>

 重启应用后,打开spy.log看看,看里面的日志是不是看起来比较不爽?下面我们安装SQL Profiler来让自已的视线爽一点。


解压sqlprofiler-0.3-bin.zip,把spy.properties拷贝到项目中,覆盖之前的spy.properties,要改的也只是realdriver,可以看到配置文件中有log4j,这就需要我们吧log4j的jar拷贝到应用中。

sqlprofiler.jar并不需要拷贝到应用中,他需要我们来执行:
java -Xmx256m -jar sqlprofiler.jar



spy.properties片断:
log4j.appender.SQLPROFILER_CLIENT=org.apache.log4j.net.SocketAppender
log4j.appender.SQLPROFILER_CLIENT.RemoteHost=localhost
log4j.appender.SQLPROFILER_CLIENT.Port=4445
log4j.appender.SQLPROFILER_CLIENT.LocationInfo=true

p6spy 通过SocketAppender 向sqlprofiler发送日志信息,sqlprofiler启动后就开始监听本机的4445端口,在应用中执行数据库操作后就可以在sqlprofiler的界面中看到sql语句的执行结果。

最后一个需要注意的问题就是需要先启动 SQLProfiler,此时状态栏显示P6SPY为未连接状态,然后再启动应用程序或者 Tomcat 等应用服务器,应用运行后SQLProfiler状态栏就会变为连接状态。这是因为 SQLProfiler 默认使用的是 Log4j 的 SocketAppender,所以要先启动。否则,会因你的应用程序或应用服务器中的 Web 应用之类的因连接不到 Socket 的服务器(SQLProfiler 相当于 Socket 的服务器)而发生错误,可以通过 SQL Profiler 控制界面最下面的连接状态就可以知道是否有程序连接上来。

你可能感兴趣的:(sql,Hibernate,log4j,bean,应用服务器)