【问题标题】:How to intercept the Hibernate generated SQL?如何拦截Hibernate生成的SQL?
【发布时间】:2010-08-04 07:14:10
【问题描述】:

对于一个像老大哥一样工作的安全系统(如被监视的强制访问控制),我们必须拦截和处理 hibernate 生成的所有选择语句。我们将用户、时间戳和 sql 选择存储在数据库中,以便使用其他工具进行一些分析。这些信息允许确定用户试图查看的内容。对于 select 语句,准备好的属性是有价值的。我们需要包含所有参数的完整 SQL 语句。

是否有任何监听器或拦截器可以让我们加入并处理所有这些事情?目前最大的突出问题是语句参数的收集。

谢谢

【问题讨论】:

标签: java hibernate


【解决方案1】:

org.hibernate package is set to DEBUG, and with the hibernate.show_sql property set. 的日志记录级别使用JDBCAppender 时,实际参数值恰好可用(至少据我所知),如果您希望数据库本身中的记录器输出。

或者,您可以查看log4jdbc project,它声称以下内容:

在记录的输出中,对于准备好的 语句,绑定参数是 自动插入到 SQL 输出。这大大提高了 许多人的可读性和调试 案例。

如果不合适,您可以调查是否P6Spy can be used in your situation。在 WebLogic Server 上,等效功能是通过 WebLogic JDBC Spy 实现的,它与某些数据库的 WebLogic JDBC 驱动程序一起开箱即用。这两个都写入 System.out 而不是数据库(除非我弄错了),所以它可能没有那么有用。

【讨论】:

  • 这很好用,我编写了自己的附加程序来将语句写入数据库。唯一阻碍我的是如何获取触发此语句的相应用户。这几乎是不可能解决的。有什么想法吗?
  • 我不确定,因为我还没有尝试过。基本上,您需要将正在执行 SQL 语句的用户/主体映射到正在记录的数据。在 SLF4J/log4j/logback 中,这是通过 MDC - Mapped Diagnostic Context 实现的。您的模式字符串也需要修改以适应主体。关于让 MDC 在 logback 中工作的文章可能会有所帮助 - logback.qos.ch/manual/mdc.html 顺便说一句,如果可以修改 appender 模式字符串以反映用户(如果这是缺少格式字符串的情况),则不需要 MDC .
  • 非常感谢,我选择了log4jdbc项目,作为最活跃的项目,效果非常好。再次感谢。
【解决方案2】:

您可以使用Interceptor.prepareSQL() (3.1+) 来拦截准备好的语句。

我认为不深入抽象层就无法获取实际参数。一种可能的解决方案是使用 JDBC 代理驱动程序(请参阅 P6Spy)。

希望对您有所帮助。

【讨论】:

  • 对了,知道了这个接口,有界参数哪里来?据我所知,没有办法获得实际参数。
  • 准确地说是Interceptor#onPrepareStatement(String sql)。但这使您可以访问正在准备的 SQL 字符串,而不是 生成的 查询。
猜你喜欢
  • 2021-03-16
  • 1970-01-01
  • 2012-09-26
  • 2022-12-17
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多