有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案