我当前项目的要求之一是能够记录由 Hibernate 或 Ibatis 生成的 SQL 语句,并将它们保存到特定表(在 SQLServer 上),以便管理员可以回来查看运行了哪些查询以及谁运行运行它们,甚至按需重用这些语句。虽然我不同意这种方法,但我想知道是否真的存在可以实现这一目标的库。我正在为我的 Web 应用程序使用 Spring 框架。
5 回答
有 3rd 方 SQL Server 工具可以捕获 T-SQL 语句,并将它们存储起来以供以后操作和分析,例如Idera SQL Compliance Manager和ApexSQL Comply
免责声明:我在 ApexSQL 担任产品支持工程师
另一种方法是在 Hibernate 配置设置中启用 SQL 语句日志记录,然后将语句“悬停”出日志文件。
但我认为数据库服务器端解决方案可能是最好的,因为它还可以捕获使用数据库的交互式查询工具执行的查询和更新。
如果要捕获 Hibernate 或 Ibatis 等中间件的所有查询,最简单的方法是使用SQL Server 分析器或使用 SQLTrace 存储过程(sp_trace_create、sp_trace_setevent)创建跟踪。使用 SQL Profiler,您可以将跟踪直接保存到表中,使用生成 trc 文件的 SQLTrace 存储过程,您必须使用 sql 语句将它们插入到表中。它们是网络上的很多示例,例如这里 SQL Profiler 可以选择在定义跟踪后生成 SQLTrace SQL 脚本(文件/导出)
SQL Profiler 是developper 版,而不是Express 版。SQLTrace 存储过程适用于所有版本 (IIRC)。
您可以在 developerper 版本上生成跟踪脚本并在您的 express 版本上运行它。您还可以创建一个存储过程,在服务器启动时创建和启动跟踪。
我知道一种方法,虽然它不容易实现。制作自定义数据源 - 对真实数据源(如 Apache BasicDataSource)的包装器。它将拦截 getConnection 调用并包装目标 DataSource 返回的 Connection。这个包装的 Connections 将拦截 createStatement / createPreparedStatement 调用并包装返回的 Statements / PreparedStatement。语句包装器现在可以拦截 SQL 执行并记录它们。
您可以在服务器上执行此操作,如果您拥有 SQL Server 企业版,则使用数据库审核。或者您可以使用扩展事件。您只需要按应用程序名称进行过滤,其中应提及 ORM。为了进一步帮助您,请提供 SQL Server 的版本和版本。