java - 자바fx - 다중 스레드 응용 프로그램에서 Hibernate를 사용하는 방법?



자바 swing이란 (1)

나는 각 스레드가 객체를 가져 와서 그것을 테이블에 삽입하려고 시도하는 다중 스레드 응용 프로그램을 위해 Hibernate를 사용하려고 노력하고있다. 내 코드는 다음과 같습니다. 스레드 당 로컬 하이버 네이트 세션 객체가 있고 각 InsertData에는 beginTransaction과 commit가 있습니다.

내가 직면 한 문제는 여러 번 "org.hibernate.TransactionException : 중첩 된 트랜잭션이 지원되지 않는다"라는 것입니다.

나는 최대 절전 모드에 익숙하지 않기 때문에 내가하고있는 일이 맞는지 아닌지 모르겠다. 나에게 다중 스레드 응용 프로그램에서 최대 절전 모드를 사용하는 올바른 방법과 위에서 언급 한 예외를 피하는 방법을 알려주십시오.

감사

public class Worker extends Thread {
private Session session = null;

Worker() {
    SessionFactory sf = HibernateUtil.getSessionFactory(); // Singleton
    session = sf.openSession();
    session.setFlushMode(FlushMode.ALWAYS);
}

public void run() {
    // Some loop which will run thousand of times 
    for (....)
    {
        InsertData(b);
    }
    session.close();
}

// BlogPost Table has (pk = id AutoGenerated), dateTime, blogdescription etc. 
private void InsertData(BlogPost b) {
    session.beginTransaction();
    Long id = (Long) session.save(b);
    b.setId(id);
    session.getTransaction().commit();
}
}

내 최대 절전 모드 설정 파일은 c3p0.min_size=10c3p0.max_size=20


스레드 당 세션 객체를 사용하면 여러 스레드간에 세션 객체를 공유하지 않는 한 괜찮을 것입니다.

받은 오류는 다중 스레드 사용이나 세션 관리와 관련이 없습니다. 명시 적으로 ID를 설정하는 것뿐만 아니라 session.save() 를 사용하는 것은 적절하지 않습니다.

BlogPost 대한 매핑을 알기 힘들지 만 Hibernate에 id 필드를 기본 키로 사용하도록 말했고 기본 키에 기본 생성기를 사용하는 경우 다음을 수행하면됩니다.

session.beginTransaction();
session.persist(b);
session.flush(); // only needed if flush mode is "manual"
session.getTransaction().commit();

Hibernate는 당신을 위해 ID를 채울 것이고, persist() 는 트랜잭션 경계 내에서 삽입을 발생시킬 것이다 ( save() 는 트랜잭션을 신경 쓰지 않는다). 플러시 모드가 수동으로 설정되어 있지 않으면 flush() 를 호출 할 필요가 없습니다. Transaction.commit() 이이를 처리합니다.

persist() 에서 BlogPost의 ID는 세션이 플러시 될 때까지 설정되지 않는다는 점에 유의하십시오. 여기에서 사용하는 것이 좋습니다.

정상적으로 오류를 처리하려면 다음을 수행하십시오.

try {
    session.beginTransaction();
    try {
        session.persist(b);
        session.flush(); // only needed if flush mode is "manual"
        session.getTransaction().commit();
    } catch (Exception x) {
        session.getTransaction().rollback();
        // log the error
    }
} catch (Exception x) {
    // log the error
}

그런데 BlogPost.setId() 비공개로 설정하거나 패키지를 표시하는 것이 좋습니다. 다른 클래스가 ID를 명시 적으로 설정하면 구현 오류가 발생할 가능성이 큽니다 (다시 기본 생성자로 가정하고 id를 기본 키로 가정).





hibernate