使用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 控制界面最下面的连接状态就可以知道是否有程序连接上来。