2014-05-13 3 views
0

MySQL 데이터베이스가있는 Glassfish 서버에서 JSF 프로그램을 개발 중입니다. 나는 현재 다음과 같은 단순한 코드 버전의 Singleton LocalBean을 가지고있다.스케쥴에서의 JTA UserTransaction

@Resource 
private UserTransaction trans; 

@Schedule(second = "30", minute = "*", hour = "*", dayOfWeek = "*", dayOfMonth = "*", month = "*", year = "*", info = "subTimer") 
private void scheduledTimeout(final Timer t) 
{ 
     InsertIntoDatabase(); 
    } 

private void InsertIntoDatabase() 
{ 
    trans.begin(); 
    trans.doTransaction(); 
    trans.commit(); 
} 

일정이 없으면 코드가 정상적으로 작동한다. 불행히도, 나는 매일 MySQL 데이터베이스에 수표를 넣고 가능하면 정보를 삽입해야합니다. 내가 몇 가지 연구를 시도

SEVERE: Transaction commit error 
java.lang.IllegalStateException: Operation not allowed.  
at com.sun.enterprise.transaction.UserTransactionImpl.checkUserTransactionMethodAccess(UserTransactionImpl.java:146) 

그리고 당신이 타이머 또는 예약 이벤트 내에서 UserTransactions를 실행할 수 있음을 볼 수 있지만, 나는 일정에 따라 트랜잭션을 실행하는 방법이 필요합니다 : 나는 이것을라는 오류를 받고 있어요 그리고 어떻게 진행해야할지 모르겠습니다.

+0

ejb에'@TransactionManagement (TransactionManagementType.BEAN)'주석이 붙어 있습니까? CMT를 사용하도록 설정된 경우 이러한 (분쟁 경계 설정) 방법은 허용되지 않습니다. 이 페이지의 맨 마지막 부분 인 http://docs.oracle.com/javaee/6/tutorial/doc/bncij.html을보십시오. –

+0

아니요, 지금 거래 관리 주석이 없습니다. – gdawgrancid

답변

0

미안하지만, 어리석은 질문과 알아 냈어. 트랜잭션이 스케줄러에서 시작 되었기 때문에 나는 거기에 사용자 트랜잭션을 가질 필요가 없었습니다. 그래서 EntityManager.merge()를 호출하면 모든 트랜잭션 관리가 마치 스케쥴러에 의해 처리되어 작업이 완료됩니다.