2012-01-13 75 views
2

我有一個服務方法的API可以被調用來檢查我的數據庫連接的健康狀況。如何一般測試與休眠數據庫連接

該方法從屬性文件中提取查詢字符串(取決於數據庫供應商,現在使用Sybase和HSQL,將來會更多),並執行它。然後該方法讓調用者知道它是成功還是失敗。

除了這個,我用的是Query.setHint("javax.persistence.query.timeout")設置超時的查詢:

javax.persistence.EntityManager entityManager; 
... 
Query heartbeatQuery = entityManager.createNativeQuery(heartbeatQueryString); 
heartbeatQuery.setHint("javax.persistence.query.timeout", heartbeatTimeout); 
heartbeatQuery.getResultList(); 

我的問題是超時屬性正在對我的Sybase數據庫,但不反對我的HSQL DB。這聽起來像取決於供應商,所以我不知道它何時能夠工作。

有沒有更好的方法來一般測試數據庫連接&包括某種超時參數?

回答

0

好可悲沒有。 JPA的查詢提示不是強制性的,即由實現者(EclipseLink,Hibernate等)執行或不執行。此外,即使實現者確實選擇了識別某個查詢提示,但如果該提示的功能不被數據庫支持,那麼它將不起作用(這裏有些實現者很好,並告訴你某個提示是否會失效)當前數據庫,而其他人默默地失敗)。在HSQLDB的情況下,無法設置查詢超時。您只能設置登錄超時(即失敗前應等待成功登錄多久),而不是查詢持續時間。

但事情並不那麼嚴峻。一方面,即使你解決了這個問題,你仍然會遇到與HSQLDB有關的其他問題,因爲它不支持大多數dbs擁有的許多其他很好的功能。您應該只使用HSQLDB進行基本的集成/單元測試。對於更多涉及的測試,您可以使用集成的MySQL Java庫。你可以在這裏找到它:

http://dev.mysql.com/doc/refman/5.0/en/connector-mxj.html

這是一個簡單的包裝完全工作MySQL服務器,這對明星Java API和停止,適用於大多數主流操作系統(贏,林,OS X等) 。這樣你可以讓你的集成測試啓動一個真正的Mysql服務器,然後在那裏嘗試你的代碼,查詢超時提示等東西可以正常工作。

+0

謝謝你的解釋。我擔心可能會出現這種情況,但這對我來說並不是什麼大問題。如果有更好的方式讓Hibernate用戶測試一個數據庫連接,我會很有興趣聽到它。我不知道MySQL Java庫 - 這很有趣,我會看看它。 – gregdferrell 2012-01-14 00:34:55