2

Jboss5で実行されている Web アプリケーションにDAO レイヤー(Sybase DB)を実装するために Hibernate を使用しています。

私が直面している問題は、クライアント/UI が複数の同時 HTTP 呼び出しを行うときです。これにより、DAO 挿入メソッドが呼び出されます。競合状態が発生し、両方の呼び出しで DAO 挿入メソッドがほぼ同時に実行されます。私が実際に欲しいのは

  1. 最初のリクエストは DAO メソッドを呼び出します
  2. 最初のリクエストは現在のデータベース値を読み取ります
  3. 現在のデータベース値に基づいて新しいデータが有効かどうかを確認します
  4. 有効な場合は、新しい値を挿入します
  5. そして、現在の db 値を読み取るための 2 番目の要求
  6. 新しいデータが有効かどうかを確認する
  7. 有効な場合は、値を挿入します...さらに呼び出しがある場合など

私のDAOレイヤーコードは次のようになります:

@Override
@Transactional
public Set<PartyData> insertPartyData(final Set<PartyData> pData) throws DataServiceException
{
    sessionFactory.getCurrentSession().getTransaction().begin();
    //code to read the current db value
    //validation code to check if new value can be inserted based on what's currently in db
    sessionFactory.getCurrentSession().save(pData);
    sessionFactory.getCurrentSession().getTransaction().commit();
}

質問?

前のトランザクションが完了するまで他の要求が待機するように、db が 1 つのトランザクションの間テーブルをロックすることを確認するにはどうすればよいですか?

4

3 に答える 3

0

IMO これは、アプリケーション レベルではなくコンテナ レベルで実行するのが最適です (アプリケーション レベルで実行できるかどうかはわかりません)。

この記事に基づいて、コネクタで2つの属性を構成することで、好きなことを行うことができます.

1に設定maxThreadsmaxThreads: The maximum number of request processing threads to be created by this connector, which therefore determines the maximum number of simultaneous requests that can be handled. If not specified, this attribute is set to 200.

これにより、毎回正確に 1 つの要求を実行することが保証されます。

acceptCount: ( acceptCount: The maximum queue length for incoming connection requests, when all possible request processing threads are in use. Any requests received when the queue is full will be refused. The default value is 10.)を増やします

これは、サービスへの接続を拒否せず、別のリクエストの実行が完了するまでキューに追加するために、比較的高く設定する必要があります。

于 2013-07-26T10:55:45.210 に答える