1

(まず第一に、これは私のコードではありません。第二に、有罪を保護するために、クラス名を変更して私の雇用主に固有のものを非表示にしました。そのため、物事が互いに対応していない場合はそれが理由です!)。

誰かが疑問を解消するのを手伝ってくれますか? 完全な接続プールの問題を調査するように依頼されましたが、このコードはにおいがするようです。

org.hibernate.SessionException: Session is closed!ログには、動作の悪い接続プールを使用する次のコードの周りに多くのログがあります。

呼び出しは Web サービス経由で行われます。

1  @Stateless
2  @WebService(name="MyWebService", targetNamespace="http://www.mycompany.com/2010/01/WebService/myWebService")
3  @WebContext(contextRoot="/myContextRoot", secureWSDLAccess=false)
4  public class MyWebService implements IMyWebService {

6    @WebMethod
7    @NotNull
8    public ArrayList<SearchResult> performSearch(ArrayList<String> criteria) {
9      GetAllResponses caller = new GetAllResponses();
10     return caller.doSearch(criteria);
11   }

13 }

クラスは次のGetAllResponsesとおりです。

1  public class GetAllResponses {
2    private static MyHome myHome = new MyHome();

4    public SearchResult doSearch(ArrayList<String> criteria) {
5      return doSearchInternal(criteria.elementAt(0), criteria.elementAt(1));
6    }

8    private SearchResult doSearchInternal(String a, String b) {
9      DataObject info = myHome.findDataObject(a, b);
10     return info.getAsSearchResult();
11   }
12 }

そしてMyHome、次のとおりです。

1  @Stateless
2  @Local({MyHomeInterface.class})
3  public class MyHome {
4    private Session session;

6    public DataObject findDataObject(String a, String b) {
7        try {
8            this.session = MyHibernateUtil.getSessionFactory().getCurrentSession();
9            Transaction tx = this.session.beginTransaction();
10           //do stuff with session and return a DataObject
11       } catch (Exception ex) {
12           ex.printStackTrace();
13       } finally {
14           this.session.close();
15       }
16   }

18   public DataObject doAnotherFind(String a, String b) {
19       try {
20           this.session = MyHibernateUtil.getSessionFactory().getCurrentSession();
21           Transaction tx = this.session.beginTransaction();
22           //do stuff with session and return a DataObject
23       } catch (Exception ex) {
24           ex.printStackTrace();
25       } finally {
26           this.session.close();
27       }
28  }

30 }

GetAllResponsesクラスの2 行目MyHomeが静的フィールドとしてインスタンス化され、フィールドの 8 行目と 20 行目MyHomesession割り当てられていることに注意してください。

私の理解では、SSBMyHomeは J2EE サーバー (JBoss 4.2.2 GA) によって管理されていません。これはGetAllResponses、JNDI で検索されるのではなく、クラスの静的フィールドとしてインスタンス化されているためです。したがって、2 つのスレッドが の同じインスタンスに同時にアクセスする可能性がMyHomeあり、セッションがフィールドに保存されるためsession、最初の呼び出しがSession別の に簡単に置き換えられ、 (の 9 行目と 21 行目Sessionを含むあらゆる種類の問題が発生します。たとえば、2 つのスレッドが を呼び出した場合、最初のスレッドは 2 番目のスレッドが 8 行目を実行した直後に 14 行目を実行し、その後 9 行目を実行します)。org.hibernate.SessionException: Session is closed!MyHomefindDataObject

私は正しいですか?

4

1 に答える 1

2

はい、あなたは正しいです。

また、myHome が静的でない場合でも、MyHome によって返されるすべてのオブジェクトがセッションから切断されることに注意してください。MyHome の外部から遅延プロパティを初期化することはできません。

セッション変数も、インスタンス変数ではなく、MyHome メソッドのローカル変数にする必要があります。

しかし、主な問題は、ステートレス セッション Bean がトランザクションを宣言的に区別するために使用されることになっていることです。EJB 環境では、トランザクションを開いたり、コミットしたり、ロールバックしたり、セッションを閉じたりする必要はありません。すべては、sessionFactory.getCurrentSession() によって実装された JTA トランザクション同期によって行われる必要があります。

于 2011-03-10T12:11:37.653 に答える