それをデバッグするためのいくつかの提案
-
スティーブがコメントで述べたように。 unreturnedConnectionTimeoutオプションを削除するとどうなるかを確認してください。
-
クエリに時間がかかりすぎている可能性があります。コードにいくつかのパフォーマンス統計を記録して、クエリにかかる時間を確認してください。クエリを調整する必要があるかもしれません。また、短期的には、unreturnedConnectionTimeoutをクエリの応答時間より長くすることもできます。
-
また、休止状態でトランザクションタイムアウトオプションを試してください。 tx.setTimeout(20)を設定し、タイムアウト数を試して、一部のクエリがタイムアウトするかどうかを確認できます。
-
また、プロファイリングツールを使用することもできます。 VisualVM をお試しください Javaバージョンがサポートされている場合。それ以外の場合(LinuxまたはMacの場合)、Javaデバッグコマンド 古いバージョンのJavaで。これらのコマンドの一部は、JDKからも入手できます。
コードの小さな改善
-
問題が本当に解決するかどうかはわかりませんが、例外ブロックにトランザクションのロールバックを追加することをお勧めします。別の例外を回避するために、tx.closeに別のtrycatchを追加しました。
-
また、セッション終了のnullチェックを追加しました。ある条件がfinallyが完全に実行されない可能性があることをすでに知っているかもしれません-別の例外がfinallyブロックでスローされた場合。現在、コードには適用できない場合がありますが、finallyブロックに複数の行を追加する場合は、次の行を実行できるように例外がカバーされていることを確認してください。
-
もう1つの提案は、トランザクション自体の範囲を縮小することです。コードを見ると、uidが見つからない場合にのみトランザクションが必要になる可能性があります。 if(u ==null)ブロック内のトランザクションコードを制限するのはどうですか。役立つかどうかはわかりませんが、読み取り用のトランザクションは必要ありません。
以下は私のサンプルコードです
public static Basicinfo getBean(Integer iduser) {
Basicinfo u = null;
Transaction tx = null;
Session sess = NewHibernateUtil.getSessionFactory().openSession();
try {
Query q = sess.createQuery("from Basicinfo where iduser=" + iduser);
u = (Basicinfo) q.uniqueResult();
if (u == null) {
tx = sess.beginTransaction(); //line 69
u = new Basicinfo();
u.setIduser(iduser);
tx.commit();
}
} catch (Exception ex) {
ex.printStackTrace();
if(tx != null) {
try {
tx.rollback();
} catch(Exception e){e.printStackTrace;}
}
} finally {
if(sess!=null) {
sess.close();
}
}
return u;
}