QA@IT

spring+hibernate+oracle でSQL実行が応答なしになる

3888 PV

spring+hibernate+oracle TOMCAT6.0 でAPIを作成しました。
あるとき、APIを実行しても応答なしとなりました。
原因を調べたところ、以下の3行目のメソッドを実行後無応答となっていました。

1、Session session = null;
2、session = getHibernateTemplate().getSessionFactory().openSession();
3、List<?> list = session.createSQLQuery(sqlBuilder.toString())
        .addScalar("year", Hibernate.STRING).list();

TOMCATを再起動し、再びAPIを実行すると、期待通りの応答が返ってきます。
この現象は、時々起るのですが、どうするとこうなってしまうかは分かりません。

spring+hibernateには明るくなく困っているので、解決方法のお知恵を貸して頂きたく思います。

私の予想では、クエリの実行を無制限に待ってしまっている気がするのですが・・・
createSQLQueryメソッドで無応答であれば、Timeoutを設定すればよい気もするし、
listメソッドで無応答なら・・・・解決方法が分からない・・・
しかし、Timeoutの設定方法も分からない・・・

回答

まずは応答が固まってしまったときにどこでストップしているのかを調べる必要があります。スレッドダンプを取って調べましょう。
スレッドダンプの取り方は以下が参考になります。
http://samuraism.jp/diary/2006/09/21/1158846052527.html

編集 履歴 (0)
  • お返事が遅くなってしまって、申し訳ありません。
    再現も難しいのですが、再現させることができたら、教えて頂いた方法で、スレッドダンプを取得してみたいと思います。
    回答頂き、ありがとうございます。
    -

Timeoutの設定方法は、
session.getTransaction().setTimeout(秒数)
です。

SQLをshow_sql=onで表示して、単体で(A5SQLなどで)実行してみて時間を見てはいかがでしょう。

あとは query.setCacheable(true/false) でHibernateのキャッシュをオン/オフすると
結果が変わるかもしれません。

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。