HibernateCursorItemReader获得对会话的非线程安全访问错误

时间:2019-03-27 13:38:36

标签: java multithreading hibernate spring-batch

@Component
@Scope("step")
public class MyReader implements ItemReader<MyDto>, InitializingBean{
    private HibernateCursorItemReader<Object[]> reader;
    @Autowired
    private SessionFactory sessionFactory;

    @Override
    public void afterPropertiesSet() throws Exception{
        reader = new HibernateCursorItemReader<>();
        reader.setSessionFactory(sessionFactory);
        reader.setUseStatelessSession(true);
        reader.setQueryString(/*query*/);
        //...
    }

    public MyDto read() throws Exception{
        Object[] record = reader.read(); //exception here org.hibernate.AssertionFailure: possible non-threadsafe access to the session
    }
}

使用HibernateCursorItemReader时,出现了org.hibernate.AssertionFailure: possible non-threadsafe access to the session异常。

如何解决?

我需要它来运行read(),以便可以将结果转储到新的MyDto对象中,以便编写者进行处理/写入。作者也有自己的db调用,以获取其他详细信息。

1 个答案:

答案 0 :(得分:0)

As Javadoc saysHibernateCursorItemReader 不是线程安全的。问题不在于您发布的课程中,而在于您使用它的方式。可能是您在多线程步骤中使用它,但是您不能这样做。除了使用单线程步骤(显而易见)之外,安全的多线程解决方案是使用async ItemProcessor/ItemWriter

另请参阅https://stackoverflow.com/a/28724199/685806