如何在hibernate中记录失败的sql?

孙兴斌*_*孙兴斌 7 java sql hibernate spring-data-jpa spring-boot

我正在使用spring-data-jpa构建SpringBoot应用程序.我知道如何记录这个问题的所有sqls.使用Hibernate时如何使用参数值打印查询字符串

但是,如果我只想记录失败的sqls呢?

Ale*_*rov 10

有两种选择:

  1. 使用参数值配置sql日志记录.禁用jdb​​c批处理并通过休眠方式启用刷新.
  2. 添加调试JDBC驱动程序,例如p6spy,它或多或少会完全如上所述.

首先,让我们分析问题并将查询类型拆分为SELECT和INSERT/UPDATE查询.

  1. 对它们进行SELECT查询,默认情况下会刷新.因此,当发生错误时,您确切地知道哪个查询失败了.
  2. INSERT/UPDATE查询,这里的事情变得棘手,因为你的刷新将关闭,你有查询批处理,这意味着,当你运行查询时,它会被延迟.其次,它会被其他不相关的查询打包,第三,Hibernate可能会重新排序它们.所以简短的回答是,如果你单独使用hibernate,这对于INSERT/UPDATE是不可行的.

解决问题的方法基本上需要做两件事:1.它应该使用参数值记录查询.这可以通过以下方式完成:

# logs the SQL statements
log4j.logger.org.hibernate.SQL=debug 

# Logs the JDBC parameters passed to a query
log4j.logger.org.hibernate.type=trace 
Run Code Online (Sandbox Code Playgroud)

2.解决方案需要禁用批处理查询,否则,您将获得一堆SQL,但您不会知道哪个SQL确实是有问题的.

hibernate.jdbc.batch_size=1
Run Code Online (Sandbox Code Playgroud)

不确定这是否足以完全禁用批处理,但你需要找出答案.

或者,您可以使用专为DEBUG设计的jdbc驱动程序.这将是p6spy驱动程序,它可以选择刷新每个单独的SQL语句,这正是您想要的.

在这里,您需要设置autoflush=true配置参数以确保每个单独的sql语句立即刷新到数据库. https://p6spy.readthedocs.io/en/latest/configandusage.html