JavaSpring数据JPA随时间大容量插入
我想用spring数据jpa将我的记录批量插入到oracle表中。我创建了一个列表,并在运行时将项目添加到列表中。列表大小为50,如果列表达到此大小,则将所有列表记录保存到数据库中,如果列表无法在100毫秒内达到完整大小,则清除列表,并将所有列表记录保存到数据库中。我用下面的测试类模拟了这种方式
@RunWith(SpringRunner.class)
@Slf4j
public class BulkInsertTest {
static List<FraudRequestTransactionsEntity> requestTransactionsEntityList = new ArrayList<>(50);
private Timer dbWriterTimer = new Timer("DBWriterTimer");
@Mock
FraudRequestTransactionsRepository fraudRequestTransactionsRepository;
@Test
public synchronized void saveRequestToDatabase(FraudActionsRestRequest fraudActionsRestRequest) {
try {
long start = System.currentTimeMillis();
FraudRequestTransactionsEntity fraudRequestTransactionsEntity = new FraudRequestTransactionsEntity();
if (requestTransactionsEntityList.size() != 10) {
if(requestTransactionsEntityList.size()==0) {
CustomRequestTimerTask customTimerTask = new CustomRequestTimerTask(requestTransactionsEntityList);
dbWriterTimer.schedule(customTimerTask, 1000L, 1000L);
}
requestTransactionsEntityList.add(fraudRequestTransactionsEntity);
} else {
dbWriterTimer.cancel();
fraudRequestTransactionsRepository.saveAll(requestTransactionsEntityList);
log.info("REQ DB writing time reached list size: {} delta: {}", requestTransactionsEntityList.size(), System.currentTimeMillis() - start);
requestTransactionsEntityList.clear();
}
} catch (Exception e) {
log.error("[{}] Exception occured while FraudActionsRestRequest saving to db ", fraudActionsRestRequest.getTransactionId(), e);
}
}
class CustomRequestTimerTask extends TimerTask {
List<FraudRequestTransactionsEntity> fraudRequestTransactionsEntityList;
CustomRequestTimerTask(List<FraudRequestTransactionsEntity> fraudRequestTransactionsEntityList) {
this.fraudRequestTransactionsEntityList = fraudRequestTransactionsEntityList;
}
@Override
public void run() {
if(fraudRequestTransactionsEntityList.size()>0) {
long start = System.currentTimeMillis();
log.info("CustomRequestTimerTask executing with list size: {} ",fraudRequestTransactionsEntityList.size());
fraudRequestTransactionsRepository.saveAll(fraudRequestTransactionsEntityList);
fraudRequestTransactionsEntityList.clear();
log.info("CustomRequestTimerTask REQ DB writing time reached timer time {}", System.currentTimeMillis() - start);
}
}
}
}
这是解决我问题的最佳方法吗?多线程是否存在线程安全问题
共 (0) 个答案