如何拦截正在执行的查询?基本上,我必须拦截通过EntityManger执行的每个查询,并将“NATIVE”sql记录到应用程序服务器日志文件进行分析?你可以告诉我有没有办法在前后介绍所以我可以记录查询和执行时间?
请记住,JPA引擎可能是休眠或Open JPA所以无论JPA实现什么是在服务器端内省查询的通用方法?
非常感谢任何帮助..
先谢谢,
Bhavesh
答案 0 :(得分:1)
如果你正在使用hibernate,你可以使用一个hibernate拦截器,这会拦截所有被触发的查询。
Session s = sessionFactory.openSession(new MyInterceptor());
这样,任何从此会话对象触发的查询都会被拦截,您可以根据需要调整查询。也一起停止查询。
或者,您可以记录特定文件的所有查询(使用log4j)。
这要求您在hibernate cfg文件中将show_sql
设置为true。
答案 1 :(得分:0)
除了实现使用的外部属性需要使用自己的命名空间(例如com.hibernate.log)之外,我没有看到有关调试/记录JPA规范的任何内容。
由于需要在persistence.xml中提及JPA提供程序,您是否可以将特定于实现的属性放在同一个文件中(至少它是如何用于Hibernate的?)
答案 2 :(得分:0)
每个好的DBMS都应该提供(太长时间)查询记录功能。
但是如果您想继续使用Java,请尝试使用JDBC Logger或Log4JDBC。 请记住,完整的查询日志记录可能会影响应用程序的性能,因此请仔细进行生产。