您拥有的解决方案仍然会面临交易到期问题。
诀窍是在一个单独的事务中执行每个块,如下面的伪代码所示。
@Entity@NamedQueries ( value = { @NamedQuery ( name = pagedDeleteExpiredItems query= DELETE FROM MyTable WHERe (<table key>) IN ( SELECt <table key> FROM ( SELECt ROWNUM AS row_num, <table key> FROM MyTable WHERe timestamp <= :currentTime ) WHERe row_num < :pageSize ) )})public class MyEntity { @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) int doPagedDeleteExpiredItems(Date currentTime, int pageSize) { Query query = em.createNamedQuery("pagedDeleteExpiredItems"); query.setParameter("currentTime", currentTime); query.setParameter("pageSize", pageSize); int deleteCount = query.executeUpdate(); return deleteCount; }}@EJBTimerpublic class DeleteExpiredItemsTimer { @EJB(beanName = "MyEntity") MyEntity myEntity; @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) void handleTimeout(Timer timer) { Date currentTime = getCurrentTime() int pageSize = 100 int deleteCount; do { myEntity.doPagedDeleteExpiredItems(currentTime, pageSize); } while(deleteCount>0); }}


