1

Tomcat 7.0.35 (Spring 3.1、Hibernate 3.6.1、JPA 2.0) で Spring + Hibernate Web アプリケーションを実行しています。

このアプリには、Hibernate の基準を介してデータベースからデータを取得するページがあります (そうする必要がないことはわかっています)。サービス層は単にデータ層を呼び出します。コードは次のとおりです。

    Criteria criteria = sessionFactory.openSession().createCriteria(Article.class); 
    criteria.addOrder(Order.desc("updatedTime"));
    criteria.add(Restrictions.eq("account", acc));
    criteria.add(Restrictions.eq("draft", true));
    criteria.setMaxResults(1);
    Article s = (Article) criteria.uniqueResult();
    return s;

Tomcat はこのページからいくつかのリクエストしか処理できず、応答しなくなります。ブラウザがサーバーの応答を待ち続けていることがわかります (Firefox のステータス バーに「ホストを待機中」と表示されます)。

OutOfMemory などのエラー メッセージは表示されません。ブラウザが永遠に待機しているようです。

次のようにJPAに変更すると:

    @NamedQuery(name = "Article.getMostRecentDraftArticle", query = "select x from Article x where x.account = :account and x.draft = 1 order by x.updatedTime desc"),

.....

Query q = getSession().getNamedQuery("Article.getMostRecentDraftArticle");
q.setParameter("account", acc);     
q.setMaxResults(1);
List list = q.list();
if (list.size() == 0) 
    return null;
else 
        return (Article) list.get(0);

その後、すべてが正しく機能します。

Hibernate の Criteria API を使用すると、何が問題になる可能性がありますか?

ご意見ありがとうございます。

乾杯。

4

2 に答える 2

2

セッションを閉じていません。この回答を参照してください: https://stackoverflow.com/a/4049758/116509

のjavadocを読んでくださいorg.hibernate.session

典型的なトランザクションでは、次のイディオムを使用する必要があります。

 Session sess = factory.openSession();
 Transaction tx;
 try {
     tx = sess.beginTransaction();
     //do some work
     ...
     tx.commit();
 }
 catch (Exception e) {
     if (tx!=null) tx.rollback();
     throw e;
 }
 finally {
     sess.close();
 }
于 2013-04-15T16:00:43.443 に答える