有没有办法捕获Hibernate和Ibatis中执行的SQL语句然后将它们保存到数据库?

时间:2013-11-13 10:36:33

标签: java sql sql-server hibernate ibatis

我当前项目的一个要求是能够记录由Hibernate或Ibatis生成的SQL语句,并将它们保存到特定的表(在SQLServer上),这样管理员就可以回来查看哪些查询是运行和运行它们,甚至按需重用语句。虽然我不同意这种方法,但我想知道是否确实存在可以实现此目的的库。我在我的Web应用程序中使用Spring框架。

5 个答案:

答案 0 :(得分:1)

有第三方SQL Server工具可以捕获T-SQL语句,并存储它们以供以后操作和分析,例如Idera SQL Compliance ManagerApexSQL Comply

免责声明:我在ApexSQL担任产品支持工程师

答案 1 :(得分:0)

如果您拥有SQL Server的企业版,可以在服务器上进行数据库审计。或者您可以使用扩展事件。您只需要按应用程序名称进行筛选,应该提及ORM。为了进一步提供帮助,请提供SQL Server的版本和版本。

答案 2 :(得分:0)

我知道一种方法虽然不容易实现。创建一个自定义DataSource - 一个像Apache BasicDataSource这样的真实DataSource的包装器。它将拦截getConnection调用并包装目标DataSource返回的Connection。这个包装的Connections将拦截createStatement / createPreparedStatement调用并返回返回的Statements / PreparedStatements。 Statement包装器现在可以拦截SQL执行并记录它们。

答案 3 :(得分:0)

如果要捕获Hibernate或Ibatis等中间件的所有查询,最简单的方法是使用SQL Server profiler或使用SQLTrace存储过程创建跟踪(sp_trace_create,sp_trace_setevent)。 使用SQL事件探查器,您可以将跟踪直接保存到表中,使用生成trc文件的SQLTrace存储过程,您必须使用sql语句将它们插入到表中。 他们在网络上有很多例子,例如here 一旦定义了跟踪(文件/导出)

,SQL事件探查器就可以选择生成SQLTrace SQL脚本

SQL Profiler位于开发人员版本中,但不在Express版本中。 SQLTrace存储过程适用于所有版本(IIRC)。

您可以在开发人员版本上生成跟踪脚本,并在快速版本上运行它。 您还可以创建一个存储过程,在服务器启动时创建并启动跟踪。

答案 4 :(得分:0)

另一种方法是在Hibernate配置设置中启用SQL语句日志记录,然后将语句“清理”出日志文件。

但我认为数据库服务器端解决方案可能是最好的,因为它还可以捕获使用数据库的交互式查询工具执行的查询和更新。