我有一个从数据库读取的多线程批处理作业,我担心不同的线程会重新读取记录,因为 ItemReader 在 Spring 批处理中不是线程安全的。我浏览了SpringBatch FAQ部分,其中指出
您可以同步 read() 方法(例如,通过将其包装在执行同步的委托者中)。请记住,您将失去可重新启动性,因此最佳做法是将步骤标记为不可重新启动并且为了安全(和高效),您还可以在阅读器上设置 saveState=false。
我想知道为什么在这种情况下我会失去可重新启动性?可重启性与同步我的读取操作有什么关系?它总是可以再试一次,对吧?另外,这段代码是否足以同步阅读器?
public SynchronizedItemReader<T> implements ItemReader<T> {
private final ItemReader<T> delegate;
public SynchronizedItemReader(ItemReader<T> delegate) {
this.delegate = delegate;
}
public synchronized T read () {
return delegate.read();
}
}