在Struts+Spring+Hibernate框架代码中如何获取hibernate底层的SQL语句?业务需要!

解决方案 »

  1.   

    将hibernate的配置文件中的显示sql属性改为true
      

  2.   

    你用一个类
    把sql转成hql看可以不咯
      

  3.   

    不如说说你的业务是如何需要的,说不定根本不用去获取什么hibernate的sql也能实现
      

  4.   

    将show_sql设置为true也只能在日志显示中得到sql。你还必须写一个appender再去捕获你显示出来的sql.
    真不明白楼主的意图是什么。业务是你控制的,应该说sql语句你是已知的,为何还要再去捕获他?
      

  5.   

    那么我讲一下业务或许真不需要这样处理,    其实就是为了操作日志问题,现在业务需要打印两种日志,一种就是系统日志这个日志里面(将show_sql设置为true可以显示sql,里面涉及到的SQL其中有this.属性),除了这个日志还需要一个操作日志,具体就是哪个用户在什么时间做了什么SQL操作,这个SQL文不能包含比如this.属性这样的信息,也不能用“?”替代参数。希望高手解决,谢谢大家的关注!
      

  6.   

    JDBMonitor没有使用过,期待有个详细说明。
    还是说下我自己的思路。要是记录操作日志的话。还是直接在服务层中记录的好。我说的show_sql+log4j的自定义appender对性能影响太大了。不合适。
    一般我的操作日志记录方法。也是在服务层中记录的。
      

  7.   

    对于这个JDBMonitor,C2one 可否详细的介绍一下!
      

  8.   

    这是个我所在团队CowNew的产品,
    http://gforge.osdn.net.cn/projects/jdbmonitor/下面转自http://hi.baidu.com/jingleq/blog/item/01fba8cdeba442500fb34554.html
    JDBMonitor之我感2006年05月25日 星期四 01:09 A.M.  
    JDBMonitor是一个开源项目,如果说JDBMonitor是一种很好的应用包,还不如说是一种很好的设计思路。  惯例,先引用一下官方的说明:JDBMonitor是一个开源项目。使用它开发者可以很轻松为系统增加数据库执行日志功能。它使用十分方便,您所需要做的唯一事情就是在您系统的JDBC连接字符串前增加类似于 "listenerconfig=/config.xml:url=" 的字符即可,不用写任何代码。  使用 JDBMonitor,您可以把数据库执行情况记录通过各种方式记录下来,比如打印到控制台、输出到文件或者通过socket传送给远程客户端。JDBMonitor是可扩展的,您可以扩展它来将执行情况通过其他方式记录下来,您所需要做的就是写一个实现IDBListener接口的类即可。我的理解:  JDBMonitor关注于数据库执行日志记录,现在的版本核心功能还比较单一,但是整个架构体现得比较完整。在以后的开发中,如果加入数据挖掘方面的信息,或许会成为一个非常成功的开源项目。(本人对数据挖掘认识比较少,对这方面不作过多的评论)无入侵式的设计我非常佩服,很巧妙地把所要实现的功能和系统代码分离得很出色。代码清楚易懂,适合在代码中吸取其思想。使用经验:  由于JDBMonitor的无入侵式,所以配置起来非常简单。在我第一次尝试的时候,我就把JDBMonitor加入到我写的一套系统中,按照JDBMonitor源码包上的用户手册,我配置一次成功。在我那个系统中,对于数据库的操作使用struts提供的数据源配置方法配置(即配置struts-config.xml),我对原来的代码作了如下修改:<data-source type="org.apache.commons.dbcp.BasicDataSource">
    <set-property property="password" value="123456" />
    <set-property property="username" value="information" />
    <set-property property="driverClassName" value="com.cownew.JDBMonitor.jdbc.DBDriver" />
    <set-property property="description" value="informationDB" />
    <set-property property="url" value="listenerconfig=c:/log/jdbmonitor/config.xml:url=jdbc:mysql://localhost:3306/information" />
    <set-property property="readOnly" value="false" />
    <set-property property="autoCommit" value="false" />
    </data-source>  跟着给工程添加了jdbmonitor.jar包,之后建了c:/log/jbdmonitor/config.xml这个文件,该文件的内容为:<config>
    <Listeners>
    <!--the arguments of FileDBListener is the file to log the SQL statement -->
    <Listener class="com.cownew.JDBMonitor.listenerImpl.FileDBListener" arg="c:/log.txt"/>
    <!--ConsoleDBListener no arguments-->
    <Listener class="com.cownew.JDBMonitor.listenerImpl.ConsoleDBListener" arg=""/>
    </Listeners>
    <JdbcDrivers>
    <JdbcDriver class="com.mysql.jdbc.Driver"/>
    </JdbcDrivers>
    </config>  这样就完成所有配置了。我配置的listener的方式的控制台输出和文件输出。  关于监听器,我觉得现阶段该包附带的四个监听器已经足够了,单纯这个级别的数据库日志只能提供很有限的信息,开发的重点应该放在功能的加强和应用上。功能的加强,我一直都觉得必需向一个系统的其他层上面拓展,不应该局限于单纯的数据库操作层。比如web系统,对于访问web容器的ip的记录是很必要的,数据库的日志也应该以某种方式与web层的日志相融合。要以同样的无入侵式实现对web容器的监控也是一种考验。是否能借助于面向方面所带来的便利呢?值得讨论。  花了很少的时间读了读源码,体会:核心,通过对基类java.sql.*的包装,在传递数据的同时,记录下所传递的数据。 
      

  9.   

    估计应该在配数据螈时有个showSql...之类的属性,设为true,在控制台就能看见
      

  10.   

    原来是cownew的东东。
    checkout下。先顶,再学习。
      

  11.   

    早期的时候就接触过。当时cownew的首页还是灰不XX(哦~~~)。
    c2one:SVN里面为什么是空的??
      

  12.   

    里面有个binjar-src-doca.zip,里面就有发布包
      

  13.   

    要checkout的,到
    http://sourceforge.net/projects/jdbmonitor
      

  14.   

    其实你可以配置log4j的,可以把hibernate生成的SQL写入到数据库中,然后表现到在你的业务系统里
      

  15.   

    受教了,不过jdbmonitor只是打印SQL语句,这个相当于hibernate+log4j配置一样,把hibernate的HQL打印到日志里,这写语句是不能被DB执行的!
      

  16.   

    jdbmonitor可以扩展的,可以加listener
      

  17.   

    我还在尝试!
    查到有这样的一个介绍:
    > 使用 JDBMonitor,您可以把数据库执行情况记录通过各种方式记录下来,比如打印到控制
    > 台、输出到文件或者通过socket传送给远程客户端。JDBMonitor是可扩展的,您可以扩展它来将执行情况通过其他方式记
    > 录下来,您所需要做的就是写一个实现IDBListener接口的类即可。
    感觉记录方法类似扩展了log4j.我还没有看源码,先保留意见。to:tolys暂时你可以先在服务层实现。我研究下,感觉应该能够实现你所说的要求。如果能够获得到数据库执行情况记录的话用扩展IDBListener来存DB.应该是个不错的方法。
      

  18.   

    呃~~果然是扩展IDBListener接口。c2one为什么不早点发。害我思索了半天~~
      

  19.   

    to:pizzame
    有何结果了,希望你能继续关注此话题!感谢大家这么热情,特别是 pizzame ,c2one 二位仁兄!
      

  20.   

    仍在关注中。呵呵
    我写了一个测试例,实现了lz想要的功能。刚才又细细的看了下他的api,发现其本身已经实现了写库的监听器(DataBaseDBListener),可以不用去自己扩展IDBListener接口。
    不过发现了几点别扭的问题:
    首先就是在使用数据库作为持久化对象时,数据库中个表的格式是必须遵照JDBMonitor所给的格式来建立,如果想按照自己的格式。可能需要这样来变通:还是自己去扩展IDBListener,将得到的需要信息通过自己的持久化对象来进行保存。这点和log4j相似。
    其次是用文本方式作为持久化对象时,我这里总是提示com.cownew.JDBMonitor.common.LoggerException: java.io.IOException: Write error。是否还需要导入什么包?期待c2one回答。控制台和数据库我这里测试都没有问题。说下特点吧。调试过程中发先记录是通过建立一个新的线程来执行的。配置还是蛮简单的。
    写了一个test例子一会传到资源里去。我先整理下我的代码。一会过来发网址。
      

  21.   

    要用自己的数据库格式就自己扩展吧,
    com.cownew.JDBMonitor.common.LoggerException:   java.io.IOException:   Write   error,没遇到过,还有具体报错?
    是不是目标文件路径没找到?
      

  22.   

    简单的实例放在这里了。
    http://download.csdn.net/source/360339可以下载下来看下。
    我用的mavan进行的项目管理。如果没有maven。可以把pom.xml中几个常用的包导入构建路径就可以了。to:c2one 包里面的config.xml配置的是c:/aaa.txt。我没有改动直接放到我的config.xml中了。错误提示之后能够看到aaa.txt已经建立起来了。但是没有写入东西。
    贴下抛出的异常:com.cownew.JDBMonitor.common.LoggerException: java.io.IOException: Write error
    at java.io.FileOutputStream.write(Native Method)
    at java.io.DataOutputStream.writeBytes(Unknown Source)
    at com.cownew.JDBMonitor.listenerImpl.FileDBListener.logSql(FileDBListener.java:80)
    at com.cownew.JDBMonitor.common.DBLogger$LogConsumer.startConsumer(DBLogger.java:207)
    at com.cownew.JDBMonitor.common.DBLogger$LogConsumer.run(DBLogger.java:186)
    at java.lang.Thread.run(Unknown Source)
    Caused by: java.io.IOException: Write error
    ... 6 more
    com.cownew.JDBMonitor.common.LoggerException: java.io.IOException: Write error
    at java.io.FileOutputStream.write(Native Method)
    at java.io.DataOutputStream.writeBytes(Unknown Source)
    at com.cownew.JDBMonitor.listenerImpl.FileDBListener.logSql(FileDBListener.java:80)
    at com.cownew.JDBMonitor.common.DBLogger$LogConsumer.startConsumer(DBLogger.java:207)
    at com.cownew.JDBMonitor.common.DBLogger$LogConsumer.run(DBLogger.java:186)
    at java.lang.Thread.run(Unknown Source)
    Caused by: java.io.IOException: Write error
    ... 6 more
      

  23.   

    数据库环境是mysql.增加一个数据库叫projectdemo
    然后将applicationContext.xml中的
    <property name="generateDdl" value="false"/>
    设置成true.
    JDBMonitor用的那个数据库我没有做关联。一会再改下在上传。
      

  24.   

    to: pizzame我这里用的是MSSQL2005同样出现你上面的异常信息,文件陪创建了,但是没有日志信息!另,我的操作系统是日文系统! 
      

  25.   

    应该不是那个的原因。我开始的怀疑是不是有些包没有导入。
    先看看c2one 的说法吧
      

  26.   

    我对FileDBListener类,进行单独测试,可以进行文件的写操作!
      

  27.   

    在hibernate.xml配置文件中加一个show_sql =true 
      

  28.   

    to : pizzame 异常解决了没有,我现在需要写在日志文件里!
      

  29.   

    to:tolys
    看到帖子加我msn:[email protected]。今天比较晕忙,咱们用msn联系。
      

  30.   

    好的,我加了,c2one 加我MSN:[email protected]
      

  31.   

    原来已经结贴了  但是我还是贴一个地址出来    有兴趣的朋友可以看一下  
    获得hibernate的sql语句http://www.webasp.net/article/22/21872_print.htm
      

  32.   

    搭建日志文件并配置显示ddl语句