HibernateCursorItemReader получает не потокобезопасный доступ к сеансу Ошибка - PullRequest
0 голосов
/ 27 марта 2019
@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 объект для писателя для обработки / записи.Автор имеет свои собственные вызовы БД, чтобы получить и другие детали.

1 Ответ

0 голосов
/ 27 марта 2019

Как говорит Javadoc , HibernateCursorItemReader является не поточно-безопасным . Проблема не в том классе, который вы опубликовали, а в том, как вы его используете. Возможно, вы используете его в многопоточном режиме, но не можете. Помимо использования однопоточного шага (очевидно), безопасное многопоточное решение заключается в использовании async ItemProcessor / ItemWriter .

См. Также https://stackoverflow.com/a/28724199/685806

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...