首页 > 解决方案 > java spring jpa 使用 entityManager.clear() 时没有保存在 DB 表中

问题描述

我正在构建一个交易应用程序。该应用程序迭代了 1400 多只股票,并且对于每只股票,都从数据库中读取价格。阅读价格后,我执行 entityManager.clear() 以便清空持久性上下文。如果没有 clear(),系统会变得非常慢。我从从数据库中读取的实体(InstrumentPrice )创建新的 java 对象(DatePrice )

然后,对 DatePrice 对象列表执行计算,然后将这些计算存储在另一个 DB 表中。但是这个数据库表中没有保存任何内容。

当我删除 entityManager.clear() 时,计算将保存在表中,但应用程序变得不可接受的慢。

为什么 entityManager.clear() 会影响新的 Transaction ?

public void performCalculation(TaRequestDto taRequestDto, Stock stock) throws Exception {

            List<InstrumentPrice> instrumentPriceList = instrumentPriceDao.getPricesBetweenDates(stock, taRequestDto.getDateFrom(), taRequestDto.getDateTo());
            List<DatePrice> datePriceList = InstrumentPriceUtil.convertInstrumentPriceListToDatePriceList(instrumentPriceList);

            calculationService.execute(datePriceList, stock);
 }

类 InstrumentPriceDao

@Transactional(propagation = Propagation.REQUIRES_NEW)
public List<InstrumentPrice> getPricesBetweenDates(Stock stock, LocalDate dateFrom, LocalDate dateTo) {

    List<InstrumentPrice> instrumentPriceList;
    instrumentPriceList = getPriceForAllStocksBetweenDates(dateFrom, dateTo);

    entityManager.clear();
    return instrumentPriceList;
}

类计算服务

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void execute(List<DatePrice> datePriceList, Stock stock) throws Exception {

            // do some calculations
            List(Double) calculatedValues = ........

            calculationDao.insertCalculations(stock, calculatedValues);
}

类计算道

@Override
@Transactional(propagation = Propagation.MANDATORY)
public calculation insertCalculations(Stock stock, List<Double> calculatedValues ) {

    Calculation = new Calculation();
    // setting properties ...

    return entityManager.persist(calculation);
}

标签: javaspringjpatransactionsentitymanager

解决方案


所以你要清楚,这意味着你从持久性上下文中删除所有实体。https://docs.oracle.com/javaee/7/api/javax/persistence/EntityManager.html#clear--

“清除持久性上下文,导致所有托管实体分离。对尚未刷新到数据库的实体所做的更改将不会被持久化。”

之前进行刷新,这会将您的更改写入数据库: https ://docs.oracle.com/javaee/7/api/javax/persistence/EntityManager.html#flush--

“将持久化上下文同步到底层数据库。”

entityManager.flush();    
entityManager.clear();

推荐阅读