问题原因:jpa一级缓存查询大量数据结果缓存导致内存占用
处理方式:
首先在方法上加上@Transactional 注解,很重要
import javax.annotation.Resource;
import javax.persistence.EntityManager;
import org.hibernate.Session;
@Resource
private EntityManager entityManager;
entityManager.clear();
同样mybatisplus清除一级缓存:
sqlSession.clearCache();
注意:重点在这,
如果在 entityManager.clear() 之前有jpa更新操作,就会出现更新失效问题,保存一个实体可以通过 CrudRepository.save(...)-Method执行。它将使用底层的JPA EntityManager持久化或合并给定的 实体。如果实体没有保留 ,Spring Data JPA将通过调用 entityManager.persist(...)方法来保存该实体,否则将调用 entityManager.merge(...)方法。
因此,以上方案就会有问题,就需要手动提交事物,再清除缓存
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
public class Test{
@Resource
private EntityManager entityManager;
@Resource
private PlatformTransactionManager platformTransactionManager;
@Resource
private TransactionDefinition transactionDefinition;
public void test(){
TransactionStatus transactionStatus = platformTransactionManager.getTransaction(transactionDefinition);
try{
/***逻辑处理***/
platformTransactionManager.commit(transactionStatus);
}catch (Exception e) {
platformTransactionManager.rollback(transactionStatus);
}
entityManager.clear();
System.gc();
}
}