私はJBoss/Wildfly 7.1のJava Persistence APIを使用してMSSQLデータベースと通信しています。私は定期的にテーブルに挿入し、更新する長い実行非同期関数を持っているが、各更新の間に数秒間あります。この関数が実行されている間、テーブルはトランザクション内でロックされ、Javaアプリケーションの内部または外部からテーブルをクエリできません。私はこれを行うと、マージが実行されることはありませんasyncメソッドからem.mergeを繰り返し呼び出すと、データベーステーブルがロックされます
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void mergeEntity(Entity e){
em.merge(e);
}
と:私もmergeEntity
方法のための新しいトランザクションを要求しようとした
@Stateless
class Dao {
@PersistenceContext(unitName = "persistenceUnit")
private EntityManager em;
public void mergeEntity(Entity e){
em.merge(e);
}
public Entity getEntity(int id){
return em.find(Entity.class,id);
}
}
class Service {
@Inject
private Dao dao;
private void updateEntity(int id){
Entity e = dao.getEntity(id)
//do update logic
dao.mergeEntity(e);
}
}
:以下は、私は私のDAOを実装しています方法の例です操作はちょうどハングアップします。 Hibernateのトレースロギングをオンにしても、問題を示すものは表示されませんでした。積極的にテーブルを変更していないときにHibernateがテーブルをロックするのを防ぐためにできることはありますか?
「スタック」と正確な場所を調べるためにスレッドダンプを取得し、SQLログオンを有効にすると、ロックを引き起こす可能性のあるものが表示されます。 – Chris