1


0

Glassfishは、JPA / EJB / webサービスで2つの同時スレッドに制限されています

次のEJB3ステートレスセッションBeanをWebサービスを介して公開しています。

@Stateless
public class UserRoleFacade implements UserRoleFacadeLocal {
    @PersistenceContext(unitName = "SimpleEA-ejbPU")
    private EntityManager em;

    public int count() {
        System.out.println("thisClass=" + this.getClass().getSimpleName() + "@" + this.hashCode() + ", em=" + em);
        try {
            Thread.sleep(10000); // 10 sec
        } catch (InterruptedException ex) {
            Logger.getLogger(UserFacade.class.getName()).log(Level.SEVERE, null, ex);
        }
        return 0;
    }

}

ご覧のとおり、あまり機能しません。実際、リクエストを取得してから10秒間スリープする以外は何もしません。 このコードは、マルチスレッド環境でEntityManagerがどのように機能するかを詳しく知るための実験として作成しました。

Webサービスは次のようになります。

@WebService(serviceName="UserRole")
public class UserRoleWebService {
    @EJB
    private UserRoleFacadeLocal ejbRef;// Add business logic below. (Right-click in editor and choose
    // "Insert Code > Add Web Service Operation")

    @WebMethod(operationName = "count")
    public int count() {
        return ejbRef.count();
    }

}

テストを行うために、5つのブラウザーを起動し、Webサービステスターをポイントして、すべてを起動しました。 印刷された結果は次のとおりです。

テストを行うために、https://stackoverflow.com/questions/2292439/glassfish-limited-to-two-simultaneous-threads-with-jpa-ejb-web-service/2292529#2292529 [ Bozho]と15スレッドでJMeterをセットアップします。 印刷された結果は次のとおりです。

INFO: [email protected], e[email protected]55a5d0, thread=Thread[http-thread-pool-17025-(2),10,Grizzly]
INFO: [email protected], e[email protected]d0e940, thread=Thread[http-thread-pool-17025-(1),10,Grizzly]
INFO: [email protected], e[email protected]635f47, thread=Thread[http-thread-pool-17025-(39),10,Grizzly]
INFO: [email protected], e[email protected]16478c1, thread=Thread[http-thread-pool-17025-(41),10,Grizzly]
INFO: [email protected], e[email protected]121691b, thread=Thread[http-thread-pool-17025-(40),10,Grizzly]
INFO: [email protected], e[email protected]55a5d0, thread=Thread[http-thread-pool-17025-(2),10,Grizzly]
INFO: [email protected], e[email protected]d0e940, thread=Thread[http-thread-pool-17025-(1),10,Grizzly]
INFO: [email protected], e[email protected]16478c1, thread=Thread[http-thread-pool-17025-(39),10,Grizzly]
INFO: [email protected], e[email protected]635f47, thread=Thread[http-thread-pool-17025-(40),10,Grizzly]
INFO: [email protected], e[email protected]121691b, thread=Thread[http-thread-pool-17025-(41),10,Grizzly]
INFO: [email protected], e[email protected]55a5d0, thread=Thread[http-thread-pool-17025-(2),10,Grizzly]
INFO: [email protected], e[email protected]d0e940, thread=Thread[http-thread-pool-17025-(1),10,Grizzly]
INFO: [email protected], e[email protected]16478c1, thread=Thread[http-thread-pool-17025-(39),10,Grizzly]
INFO: [email protected], e[email protected]121691b, thread=Thread[http-thread-pool-17025-(41),10,Grizzly]
INFO: [email protected], e[email protected]635f47, thread=Thread[http-thread-pool-17025-(40),10,Grizzly]

[line-through] *(およびブラウザから視覚的に表示されるもの)を見るとわかるように、同時に実行されるのはたった2つのスレッドだけです。 EJBとEntityManagerの両方のインスタンスは、どこかで制限されているように見えます。 それはどこですか?

Glassfishアプリケーションサーバーでは、私の設定は次のようになります。

  • 接続プール:8初期接続、最大32

  • ejbコンテナー:初期0、最大32

それらは大丈夫だと思います。 EnitiyManagerのどこかに設定はありますか? 他に何を見るべきですか?

2 Answer


4


管理コンソールで_configuration> thread-pools> thread-pool#min-thread-pool-size_を確認します(2でなければなりません)。 しかし、それはほんのわずかであり、最大ではありません。


2


そのような制限があるとは思わない。 おそらく、ジョブは接続の遅延と組み合わされてすぐに終了したため、エンティティマネージャーは再利用されました。

より良いベンチマークを作成するには、http://jakarta.apache.org/jmeter/ [JMeter]を使用します。X秒ごとに15のリクエストを実行し、出力を共有します。 (http://www.javaworld.com/javaworld/jw-07-2005/jw-0711-jmeter.html [この記事]では、JMeterの使用を開始しています。 とにかくとても簡単です)