2012-10-02 1 views
2

DB를 수동으로 생성하고 최대 절전 모드 도구를 사용하여 Pojo, DAO를 생성했습니다. 내가 객체를 생성하고 데이터베이스에 유지하면 는 내 스레드가 데이터베이스가 새 개체로 업데이트됩니다 완료되면이 내 지속() 메소드flush() 후 데이터베이스를 갱신하지 않는 최대 절전 모드

public void persist(Object o) 
{ 
    try 
    { 
     hSession.persist(o); 
     hSession.flush(); 
    } 
    catch (Exception e) 
    { 
     hTransaction.rollback(); 
     log.error(e.getMessage()); 
    } 
} 

입니다

 DefinitionT def = new DefinitionT(); 
     def.setSelected(false); 
     def.setValue(sqlEncode(definition)); 
     def.setWordId(wordT.getId()); 
     definitionTDao.persist(def); 

잘 작동하는 표시 . 그러나, 나는 persist()를 호출 한 직후에 프로그램을 멈 추면 데이터베이스가 업데이트되지 않는다는 것을 알았다. 사실 아무리 많은 작업을 수행하더라도 스레드가 완료 될 때까지 DB에서 업데이트되지 않습니다. 나는 플러시()가 최대 절전 모드 캐시의 모든 업데이트를 데이터베이스에 푸시했다고 생각 했는가? 내가 무엇이 누락 되었습니까? 나는 이것이 Hibernate flush doesn't update database과 같은 이슈라고 생각하지만 계속 진행되는 루프는 없다.

답변

1

당신이 명시 적으로 트랜잭션을 커밋하는 경우에 대해 : 당신이 작성되어 있는지 확인하십시오, 당신이 세션, 최선을 다하고해야이 세션으로 열린 트랜잭션을 플러시 할 때 알다시피 사실

Transaction hTransaction = null; 
try { 
hTransaction = hSession.beginTransaction(); 

hSession.persist(o); 


hTransaction.commit(); 
hSession.flush(); 

} 
catch (Exception e) 
{ 
    hTransaction.rollback(); 
    log.error(e.getMessage()); 
} 

을하지만,이 확인 플러시중인 세션과의 트랜잭션. 당신이 커밋 할 때

그냥 자동으로 플러시 검사 모드가 있어야한다 :

hSession.setFlushMode(FlushMode.COMMIT) 

체크 플러시가 결국 최대 절전 모드 세션을 의미하는 SQL 문을 주문하고 데이터베이스로 전송

7

here에서. 그런 다음 데이터베이스는 롤백 세그먼트에서이를 실행하지만 수정 사항을 영구적으로 만들지 않으며 다른 사용자가 사용할 수 없도록합니다.

마지막으로 커밋하면 데이터베이스가 수정 사항을 지속적으로 저장합니다. (데이터베이스가 자동 커밋 모드에있는 경우는 예외입니다. 트랜잭션의 정확성을 보장 할 수 없으며 모든 데이터베이스에서 자동 커밋을 사용할 수 없거나 플러시 모드가 커밋으로 설정된 경우에는 사용하지 않는 것이 좋습니다.) 유연성은 느슨해집니다.

커밋은 암시 적으로 flush()를 호출하지만 flush는 commit()을 호출하지 않습니다.

당신을위한 해결책 : 프로그램 끝에서 추가 커밋을하십시오.

(덧붙여서, 매번 트랜잭션마다 플러시가 수행되지만 성능 향상을 위해 많은 트랜잭션 후에 커밋이 수행됩니다.)

관련 문제