7

JPAでhibernate 4.2.4を使用し、ManyToMany関連付けでlayzをロードしています。@ManyToMany(targetEntity=B.class, fetch=FetchType.LAZY)オブジェクト A は、逆に関連付けられています。データベースからデータを取得するには、次の (簡略化された) コードを呼び出します。

try {
   session = cutSessionFactory.openSession();
   session.beginTransaction();
   List<IBO> result = session.createQuery(query).list();
   session.getTransaction().commit();
   return result;
catch{...}
finally{
   session.close;
}

もともと私は接続を開いたままにしていたため、アプリケーションが遅延読み込みを行う必要がある場合、最初の呼び出しの後でもセッションが必要です。しかし、これにより、いくつかのアクションの後にアプリケーションがフリーズしましたが、以前の戦略にたどり着きました。これですべてが機能します。フリーズも遅延読み込みの問題もありません。しかし、いくつかの子を持つエンティティをロードすると(遅延ロードが必要です)、ログには次のように表示されます。

WARN - AbstractPersistentCollection: Unable to close temporary session used to load lazy collection associated to no session

に続く

2013-09-25 09:35:30 - INFO - BasicResourcePool: A checked-out resource is overdue, and will be destroyed: com.mchange.v2.c3p0.impl.NewPooledConnection@15f52a7
2013-09-25 09:35:30 - INFO - BasicResourcePool: Logging the stack trace by which the overdue resource was checked-out

休止状態がセッションを閉じていないことは理にかなっています (実際には、新しいセッションを使用する遅延読み込みの新しい要求があると思いました)、接続プールは未使用のセッションがあることを認識します。しかし、結局、休止状態は私の「悪いセッション処理」を修正しています。

遅延読み込みで使用されるセッションを処理するより良い方法を知っている人はいますか?

4

1 に答える 1

0

もちろん、セッションを閉じる必要があります。そうしないと、アプリケーションが正しく動作しない可能性があります。

また、ネストされたオブジェクトを遅延させてパフォーマンスを向上させ、必須の結合を追加する必要があります。

子要素にアクセスする必要がある場合は、クエリで結合を適用する必要があるため、遅延オブジェクトが読み込まれます。

class A{
      B b;
}

SQL:

select * from A Left join B on A.bid = B.id
于 2016-09-05T13:12:04.673 に答える