2012-01-13 11 views
2

データベース接続の正常性をチェックするために呼び出すことのできるサービスメソッドがAPIにあります。一般的に、ハイバネーションでデータベース接続をテストする方法

このメソッドは、プロパティファイル(DBベンダーに依存し、将来は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 DBではなく、私のHSQL DBに対して不利に働いているです。それはベンダーに依存するように聞こえるので、いつ動作するのかはわかりません。

DB接続を一般的にテストするには、より良い方法がありますか?&には何らかのタイムアウトパラメータが含まれていますか?

答えて

0

よく悲しいことに、 JPAのクエリヒントは必須ではありません。つまり、それらを実行するかどうかは実装者(EclipseLink、Hibernateなど)の責任です。さらに、実装者が特定のクエリヒントを認識することを選択したとしても、そのヒントの機能がデータベースでサポートされていない場合、それは動作しません(ここではいくつかの実装者がうまくいて、特定のヒントが現行のデータベースと他のものは静かに失敗する)。 HSQLDBの場合、クエリのタイムアウトを設定する方法はありません。ログインのタイムアウト(ログインに成功するまでにどれくらいの時間待つべきか)は設定できますが、クエリの期間は設定できません。

しかし、物事はそれほど厳しくはありません。一方で、これを解決したとしても、HSQLDBの他の問題は、ほとんどのdbsが持つ他の多くの優れた機能をサポートしていないため、依然として不安定です。基本的な統合/単体テストにのみHSQLDBを使用してください。より複雑なテストのために、統合されたMySQL Javaライブラリを使用することができます。あなたはここでそれを見つけることができます:

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

これは単にスターのためのJava APIを持ち、ストップパッケージ完全に動作するMySQLサーバ、である、ほとんどの主要なOS上で動作します(勝利、LIN、OS Xの、など) 。このようにして、統合テストで実際のMysqlサーバーを起動させて、そこでコードを試してみてください。そこでは、クエリのタイムアウトヒントなどがうまく動作します。

+0

ありがとうございます。私は恐れているかもしれませんが、これは私の大きな問題ではありません。 HibernateユーザがDB接続をテストするためのより良い方法があれば、それを聞くことに興味があります。私はMySQL Javaライブラリについて知りませんでした。興味深いところです。 – gregdferrell

関連する問題