2011-06-20 37 views
1

如何攔截正在執行的查詢?基本上,我必須攔截通過EntityManger執行的每個查詢並將「NATIVE」sql記錄到應用程序服務器日誌文件以進行分析?你能否告訴我有沒有什麼方法可以介紹前後的信息,這樣我就可以記錄查詢和執行時間了?JPA或查詢攔截

請記住,JPA引擎可以是hibernate或Open JPA,所以無論JPA實現如何,通用的方式來反思查詢在服務器端?

任何幫助是極大的讚賞..

由於事先

Bhavesh

+0

沒有通用的方法。任何體面的JPA實現都應該能夠記錄查詢,生成的任何SQL以及執行它的時間。 DataNucleus當然會 – DataNucleus

回答

0

我沒有看到有關調試/日誌記錄任何JPA規範中,除了一個事實,即外部性,一個實施使用將需要使用自己的名稱空間(例如com.hibernate.log)。

由於需要在persistence.xml中提及JPA提供程序,您是否可以不將實現特定的屬性放在同一個文件中(至少它是如何用於Hibernate的)?

1

如果您使用的是hibernate,您可以使用hibernate攔截器攔截所有查詢。

Session s = sessionFactory.openSession(new MyInterceptor());

這種方式從這個會話對象解僱任何查詢將被攔截,請你&也停止查詢一起可以調整查詢。

或者您可以記錄特定文件的所有查詢(使用log4j)。 這要求您在hibernate cfg文件中將show_sql設置爲true。

0

每個好的DBMS都應該提供(太長)查詢記錄功能。

但是,如果你想留在Java嘗試使用JDBC LoggerLog4JDBC。 請記住,完整的查詢日誌記錄可能會影響應用程序的性能,因此請仔細檢查。