データベースへの接続プール内で同時に最大20の接続がアクティブになるデフォルトのstandalone.xml構成があります。正当な理由があると思います。 Oracleデータベースを実行します。Java-EEデータベース接続プールの実行が最大になっています
サードパーティのAPIトラフィックが存在するため、妥当な量のデータベーストラフィックがあります。私が開発しているエンタープライズアプリケーションのSOAPとHTTP呼び出し。エンティティがフェッチされ、(トランザクション全体が行われ、実際に)更新後にリリースされたときに
@PersistenceContext(unitName = "some-pu")
private EntityManager em;
public void someBusinessMethod() {
someEntity = em.findSomeEntity();
soap.callEndPoint(someEntity.getSomeProperty()); // may take up to 1 minute
em.update(someEntity);
cdiEvent.fire(finishedBusinessEvent);
}
ただし、この場合には、データベース接続が取得されています
は、私たちはしばしば、以下のような何かを行います。トランザクションについては、すべてがコンテナ管理であり、追加の注釈はありません。私はあなたが必要以上にデータベース接続を「保持」してはならないことを知っています。これは私が解決しようとしているものです。私はプログラム的にコネクションを解放する方法も知らず、トランザクション全体をロールバックできるようにしたいので、これは良いアイデアだとは思っていません。
だから?この問題をどのように攻撃するのですか? ManagedExecutorService
を使用して
オプション1、::
@Resource
private ManagedExecutorService mes;
public void someBusinessMethod() {
someEntity = em.findSomeEntity();
this.mes.submit(() -> {
soap.callEndPoint(someEntity.getSomeProperty()); // may take up to 1 minute
em.update(someEntity);
cdiEvent.fire(finishedBusinessEvent);
});
}
オプション2、@Asynchronous
を使用して:
@Inject
private AsyncBean asyncBean;
public void someBusinessMethod() {
someEntity = em.findSomeEntity();
this.asyncBean.process(someEntity);
}
public class AsyncBean {
@Asynchronous
public void process() {
soap.callEndPoint(someEntity.getSomeProperty()); // may take up to 1 minute
em.update(someEntity);
cdiEvent.fire(finishedBusinessEvent);
}
}
これは、実際には、例えば、データベース接続プールの問題を解決し、私が試した多くのオプションがありますsoap.callEndPoint
が発生するとすぐに接続が解除されます。しかし、それは本当に安定していませんでした(ここで問題を特定することはできません)。もちろん、a-sync処理を開始するとトランザクションは終了します。そのため、石鹸呼び出し中に何か問題が生じたときには、何もロールバックされませんでした。
ラッピングアップ... 私は一度キューのを経由してオフロードアプリケーションの別の部分に長い実行中のIOタスク(石鹸とHTTP呼び出し)を移動しようとしてだとキューのを経由して戻ってアプリケーションに結果を供給再び。この場合、すべてがトランザクションを介して行われ、接続は保持されません。しかし、これはオーバーヘッドが多いため、この問題を解決する方法について、あなたの意見やベストプラクティスをお聞きしたいと思います!
正常に実行され、ピーク時に実行されている同時Webリクエストの数はいくつですか? –
約50〜100、ピーク時は約200です。Wildflyは、プールから接続を取得すると失敗するまで約30秒待機するように設定されています。再試行はありません。 – Velth
同じエンティティに対する同時変更を扱うための戦略は何ですか? –