2016-11-03 9 views
1

サーバは、ejbコンポーネントのサーブレットコールメソッドからサーブレットでhttpリクエストを受け取ります。異なるスレッドから呼び出した場合のクエリタイムアウト

public void ejbMethodVariant1(...) { 
    //calling stored proc 
    ... 
    //calling same stored proc 
} 

public void ejbMethodVariant2(...) { 
    //calling stored proc 
    ... 
    Thread t = new Thread(() -> { 
      //calling same stored proc 
     }); 
    t.start(); 
    try { 
     t.join(); 
    } catch (InterruptedException e){ 
     ... 
    } 
} 

ストアドプロシージャは常に同じです。 "ストアドプロシージャを呼び出すと、" 意味:

  1. がコール可能文
  2. 閉会声明バリアント1で接続

を閉じる

  • を実行するコール可能文
  • を作成するデータソース
  • からの接続を取得します - すべてエラーなしで完璧に動作します。 1回目と2回目の呼び出しでの接続には、autoCommit = falseがあります。

    第2の呼び出しでは、最初の呼び出しが正常に完了し、2分後に2回目の呼び出しが終了しました(com.microsoft.sqlserver.jdbc.SQLServerException:クエリがタイムアウトしました)。最初の呼び出しではautoCommit = falseが、2番目の呼び出しではautoCommit = の場合はとなります。

  • +1

    JEE仕様によると、スレッド作成と管理はejbでは許可されていません。 [この回答](http://stackoverflow.com/questions/3816286/multithreading-in-a-stateless-session-bean#3816621)または[this](http://www.oracle.com/technetwork/java)を参照してください。 /restrictions-142267.html#threads) –

    答えて

    2

    トランザクションコンテキスト、セキュリティコンテキストなどがコピーされていない新しいスレッドを開始しようとしています。新しいスレッドを使用してステートメントを実行する場合は、Java EE 7のユーティリティを使用することを検討してください。

    関連する問題