最近,我们与一位拥有大型项目的客户合作,他们担心Hibernate生成的SQL的可追溯性。他们的问题可能很常见:假设我在Hibernate日志中看到一些错误(例如,一些N+1查询问题),我怎么知道是哪个业务类产生了这个问题?我唯一在Hibernate日志中看到的是org.hibernate.SQL,行号224作为日志消息的来源!
我开始解释Hibernate3如何将注释嵌入到生成的SQL中,这样你就可以至少追踪到特定的HQL查询。但史蒂夫想起了log4j提供了/nested diagnostic context/。我见过很多项目使用log4j,但从未在任何一个地方见过这个功能的使用。我认为这可能是比在所有地方添加日志条目和退出日志更好的选择,因为我们甚至可以在启用/禁用日志条目/退出日志类别的情况下看到这个上下文。这是跟踪Hibernate日志中SQL来源的好方法。你只需要在DAO中调用push()和pop()方法即可。
public List getCustomersByName(String pattern) { NDC.push("CustomerDAO.getCustomersByName()"); try { return getSession() .createQuery("from Customer c where c.name like :pattern") .setString("pattern", pattern) .list(); } finally { NDC.pop(); } }
如果我把我的模式设置正确
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m (%x)%n
我会得到这样的日志消息
20:59:38,249 DEBUG [=>SQL:244] - select .... like ? (CustomerDAO.getCustomersByName())
只是想提一下,以防有人需要。