在运行时,应用程序(基于Java / Spring / Hibernate)会引发以下异常:
07:18:38.511错误批处理元素#1的错误:FOREIGN KEY“SOME_FIELD.SQL_11410213222”的插入或更新值不等于父表的父键的任何值.SQLCODE = -530
堆栈跟踪仅部分有助于找到问题的根源(这里是外键约束违规)。
有没有办法同时打印导致此异常的sql(或者至少是语句中使用的参数)?我知道这可以通过调整日志记录配置来实现,但随后将记录运行正常的语句和导致错误的语句。我只想输出与错误陈述相关的信息......这可行吗?
答案 0 :(得分:2)
Log4Jdbc是JDBC代理驱动程序,它可以拦截JDBC调用并记录信息,例如在DB中执行的确切SQL和SQL计时信息。
有什么好处的,Log4Jdbc可以在同一行中记录绑定参数的actaul值。与内置的hibenrate日志记录相比,IMO的可读性大大提高,绑定参数显示为“?”并且绑定参数的实际值以不同的行显示。
通过将记录器jdbc.sqlonly
的日志记录级别设置为ERROR
,您可以限制仅在抛出异常时记录SQL。
以下是使用log4jdbc和log4j设置日志记录的简要说明。有关详细配置,请参阅official site
1.更改使用Log4Jdbc的JDBC驱动程序:
<property name="connection.driver_class">net.sf.log4jdbc.DriverSpy</property>
2.对于您正在使用的jdbc网址,请将jdbc替换为 jdbc:log4jdbc ,例如:
<property name="connection.url">jdbc:log4jdbc:postgresql://localhost:5432/Test?protocolVersion=2</property>
3.配置log4j.properties
中不同记录器的日志记录级别。例如,仅在抛出异常时记录SQL:
log4j.logger.jdbc.sqlonly=ERROR
答案 1 :(得分:0)
您还可以通过将org.hibernate.SQL设置为debug并将org.hibernate.type设置为在日志配置中进行跟踪来启用Hibernate Logging