线程安全休眠DAO层

时间:2012-10-29 08:42:19

标签: spring hibernate thread-safety batch-processing

我有一个Transaction对象列表。

List<Transaction> transactions;

我需要通过创建一个并发更新事务的线程池来批量处理这些事务。 这些线程使用相同的DAO类( Spring 单例bean)更新这些事务以更新事务。我使用 Hibernate 作为 ORM

为了确保我的代码是线程安全的,我应该考虑什么?我有点困惑。

这是DAO课程。 SessionFactory也被定义为Spring bean,然后自动装配到DAO类。

@Autowired
SessionFactory sessionFactory;

@Override
public Transaction update(Transaction transaction) {
    Session session = sessionFactory.openSession();
    session.beginTransaction();

    session.update(transaction);

    session.getTransaction().commit();
    return transaction;
}

2 个答案:

答案 0 :(得分:1)

为了获得更好的性能,看看汇集数据库连接,有像c3p0这样的开源实现,它可以很好地与spring和hibernate一起使用。这对于批处理尤为重要。

您使用的是SessionFactory的hibernate实现吗?如果是这种情况那么它确实是线程安全的,所以你应该是好的。

另一个建议是查看可能对您的情况有用的spring batch

更新:你已经说过你正在使用Hibernate,所以SessionFactory应该是好的。

答案 1 :(得分:1)

我认为你的问题比线程安全有点大,你需要唤起事务管理。 会话工厂生成的会话是threadlocal(spring的HibernateTransactionManager和创建sessuinFactory的beanFactory - 例如:AnnotationSessionFactoryBean-管理所有这些东西)

所以你的代码是安全的;)