在Struts+Spring+Hibernate框架代码中如何获取hibernate底层的SQL语句?业务需要!
解决方案 »
- 准备做一个在线自学课程自测系统,题型是主观题目时提交卷子后让教师来阅卷给出分数,如何实现
- common-email发送邮件郁闷
- struts图片处理
- 问2个问题,散分
- 高手请指教.这样的错误.5555也在线等答案捏.......不好意思。没的分了..
- 一个jsp 注册的小问题
- java读出excel的文件内容并生成table,如何把生成的table保存成jsp或html文件
- 汉字的字符串截取大家怎么写的亚,直接用substring吗?好像不太对
- Help!!!!!!怎样配置tomcat?我的servlet执行不起来.
- jsp使用cos上传文件,如何判断是否已经选择文件?
- org.hibernate.exception.JDBCConnectionException: Cannot open connection
- getHibernateTemplate 空指针问题,困扰三天了,急!!!!!!!!
把sql转成hql看可以不咯
真不明白楼主的意图是什么。业务是你控制的,应该说sql语句你是已知的,为何还要再去捕获他?
还是说下我自己的思路。要是记录操作日志的话。还是直接在服务层中记录的好。我说的show_sql+log4j的自定义appender对性能影响太大了。不合适。
一般我的操作日志记录方法。也是在服务层中记录的。
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.*的包装,在传递数据的同时,记录下所传递的数据。
checkout下。先顶,再学习。
c2one:SVN里面为什么是空的??
http://sourceforge.net/projects/jdbmonitor
查到有这样的一个介绍:
> 使用 JDBMonitor,您可以把数据库执行情况记录通过各种方式记录下来,比如打印到控制
> 台、输出到文件或者通过socket传送给远程客户端。JDBMonitor是可扩展的,您可以扩展它来将执行情况通过其他方式记
> 录下来,您所需要做的就是写一个实现IDBListener接口的类即可。
感觉记录方法类似扩展了log4j.我还没有看源码,先保留意见。to:tolys暂时你可以先在服务层实现。我研究下,感觉应该能够实现你所说的要求。如果能够获得到数据库执行情况记录的话用扩展IDBListener来存DB.应该是个不错的方法。
有何结果了,希望你能继续关注此话题!感谢大家这么热情,特别是 pizzame ,c2one 二位仁兄!
我写了一个测试例,实现了lz想要的功能。刚才又细细的看了下他的api,发现其本身已经实现了写库的监听器(DataBaseDBListener),可以不用去自己扩展IDBListener接口。
不过发现了几点别扭的问题:
首先就是在使用数据库作为持久化对象时,数据库中个表的格式是必须遵照JDBMonitor所给的格式来建立,如果想按照自己的格式。可能需要这样来变通:还是自己去扩展IDBListener,将得到的需要信息通过自己的持久化对象来进行保存。这点和log4j相似。
其次是用文本方式作为持久化对象时,我这里总是提示com.cownew.JDBMonitor.common.LoggerException: java.io.IOException: Write error。是否还需要导入什么包?期待c2one回答。控制台和数据库我这里测试都没有问题。说下特点吧。调试过程中发先记录是通过建立一个新的线程来执行的。配置还是蛮简单的。
写了一个test例子一会传到资源里去。我先整理下我的代码。一会过来发网址。
com.cownew.JDBMonitor.common.LoggerException: java.io.IOException: Write error,没遇到过,还有具体报错?
是不是目标文件路径没找到?
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
然后将applicationContext.xml中的
<property name="generateDdl" value="false"/>
设置成true.
JDBMonitor用的那个数据库我没有做关联。一会再改下在上传。
先看看c2one 的说法吧
看到帖子加我msn:[email protected]。今天比较晕忙,咱们用msn联系。
获得hibernate的sql语句http://www.webasp.net/article/22/21872_print.htm