0

EJB TotoCacheBean の呼び出し中にシステム例外が発生しました。

メソッド: public void ...TotoCacheBean.refreshAlertCache() ...: 注意: javax.ejb.EJBException: トランザクションが中止されました 原因: javax.transaction.RollbackException at com.sun.jts.jta.TransactionManagerImpl.commit(TransactionManagerImpl.java :334)

@Singleton
@PersistenceContext(name = "persistence/popul", unitName = "popul")
@TransactionAttribute(value = TransactionAttributeType.SUPPORTS)
@ConcurrencyManagement(ConcurrencyManagementType.BEAN)
@Startup
public class TotoCacheBean
{
    private final ReadWriteLock lock    = new ReentrantReadWriteLock();

@Inject
private MessageDAO messageDAO;

public enum Type
{
    ALERT, GLOBAL
};

private Map<Type, TotoCache>    cacheStorage;

@PostConstruct
public void postConstruct() throws DAOException
{
    refreshAlertCache();
    refreshGlobalCache();
}

@Schedule(second = "*/20", minute = "*", hour = "*", persistent = false)
public void refreshAlertCache() throws DAOException
{
    refreshCache(Type.ALERT);
}

@Schedule(second = "10", minute = "*", hour = "*", persistent = false)
public void refreshGlobalCache() throws DAOException
{
    refreshCache(Type.GLOBAL);
}       

private void refreshCache(Type type) throws DAOException
{
    Date now = DateTools.getDate();
    LinkedHashMap<String, LinkedHashMap<String, ActMessDTO>> messages = messageDAO.getActMessSorted(now, (type == Type.ALERT));
    setCache(type, new TotoCache(messages, now));
}


public TotoCache getCache(Type type)
{
    lock.readLock().lock();

    try
    {
        return getCacheStorage().get(type);
    }
    finally
    {
        lock.readLock().unlock();
    }
}

private void setCache(Type type, TotoCache cache)
{
    lock.writeLock().lock();

    try
    {
        getCacheStorage().put(type, cache);
    }
    finally
    {
        lock.writeLock().unlock();
    }
}

private Map<Type, TotoCache> getCacheStorage()
{
    if (this.cacheStorage == null)
        this.cacheStorage = new HashMap<Type, TotoCache>();

    return this.cacheStorage;
}

}`

問題を解決するためのアイデアはありますか? LinkedHashMap は同期されていませんが、10 個を超えるクラスが変更されるため、変更しないことを好みます。しかし、それが理由なら私はそうします。または、問題は ReadWriteLock の使用ですか? あなたのトリックをありがとう

4

1 に答える 1

0

矛盾するConcurrencyManagementType.BEAN&を一緒に使用しています。TransactionAttributeType.SUPPORTS

ドキュメントから:

コンテナー管理のトランザクション境界が使用されている場合にのみ指定できます。

インターフェイスConcurrencyManagementType.CONTAINERを使用してトランザクションを手動で実行または管理しUserTransactionます。

さまざまな属性タイプについてはこちらを参照し、要件に応じて適用してください。

LinkedHashMap が同期されていません...

デフォルトでは、 を持つ Bean に@SingletonLockType.WRITE.

LockType.WRITE : Bean インスタンスへの排他的アクセス用。

シングルトン セッション Bean は、クライアントがそのメソッドを呼び出している間、他のクライアントに対してロックされます。したがって、並行性を明示的に制御する必要はありません。

于 2013-04-01T08:27:26.487 に答える