(まず第一に、これは私のコードではありません。第二に、有罪を保護するために、クラス名を変更して私の雇用主に固有のものを非表示にしました。そのため、物事が互いに対応していない場合はそれが理由です!)。
誰かが疑問を解消するのを手伝ってくれますか? 完全な接続プールの問題を調査するように依頼されましたが、このコードはにおいがするようです。
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 行目MyHome
がsession
割り当てられていることに注意してください。
私の理解では、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!
MyHome
findDataObject
私は正しいですか?