2015-07-10 2 views
1

У меня есть MDB, который вызывает Singleton EJB для поддержания часовых тоталов с использованием JPA. Я получаю StaleObjectStateException: Строка была обновлена ​​или удалена другой транзакциейSingleton EJB, JPA Параллельный доступ

Entity Bean Код

@Entity 
@Table(name = "hour_db") 
public class HourlyTotalEntity { 
    @Id 
    private Date transactionTime; 

    @Column(name="success_count") 
    private long successCount; 

    @Version int version; 


    public Date getTransactionTime() { 
     return transactionTime; 
    } 

    public void setTransactionTime(Date transactionTime) { 
     this.transactionTime = transactionTime; 
    } 

    public void setSuccessCount(long successCount) 
    { 
     this.successCount = successCount; 
    } 
    public long getSuccessCount() 
    { 
     return successCount; 
    } 

    public int getVersion() { 
     return version; 
    } 

    public void setVersion(int version) { 
     this.version = version; 
    } 
} 

EJB Code

@Singleton 
@ConcurrencyManagement(ConcurrencyManagementType.CONTAINER) 
@Lock(LockType.READ) 
public class HourlyTotalEJB { 
    @PersistenceContext (unitName="DashboardJPA") 
    private EntityManager em; 

    public void create(Date transactionTime) throws Exception 
    { 
     transactionTime = trim(transactionTime); 
     HourlyTotalEntity entity = em.find(HourlyTotalEntity.class, transactionTime,LockModeType.OPTIMISTIC_FORCE_INCREMENT); 
     if(entity == null) 
     { 
      entity = new HourlyTotalEntity(); 
      entity.setTransactionTime(transaction); 
      entity.setSuccessCount(0); 
     } 

     entity.setAuthSuccessCount(entity.getAuthSuccessCount() + 1); 
     em.persist(entity); 
     em.flush(); 
     em.clear(); 
    } 

    private Date trim(Date date) 
    { 
     Calendar calendar = Calendar.getInstance(); 
     calendar.setTime(date); 
     calendar.set(Calendar.MINUTE, 0); 
     calendar.set(Calendar.MILLISECOND, 0); 
     calendar.set(Calendar.SECOND, 0); 
     return calendar.getTime(); 
    } 
} 

ПДБ называют создание (transactionTime) на OnMessage (сообщение Message) метод. Во время большого объема трансакций метод create (transcationTime) будет вызываться одновременно MDB и приводит к StaleObjectStateException: строка была обновлена ​​или удалена другой транзакцией

Как решить вышеуказанную проблему?

ответ

0

Вы используете read lock, что позволяет нескольким потокам одновременно вызывать метод. Поскольку метод create не доступен только для чтения, вместо этого следует использовать блокировку записи.

+0

Это решение решило проблему? –

Смежные вопросы