一、问题记录
最近需要配置jpa多数据源,按照网上的方法,配置config类,里面有个EntityManager方法
/**
* 配置EntityManager
*
* @param builder
* @return
*/
@Primary
@Bean(name = "smartlandEntityManager")
public EntityManager smartlandEntityManager(EntityManagerFactoryBuilder builder) {
return smartlandEntityManagerFactory(builder).getObject().createEntityManager();
}
使用时我是这样写
@Resource(name = "smartlandEntityManager")
private EntityManager entityManager;
结果发现查询结果一直有缓存,后面查找了资料想了下,发现这么写有几个问题:
1、EntityManager 是线程不安全的,不应该创建这种单例的bean去管理
2、jpa的一级缓存是针对于EntityManager,即同个EntityManager实例,如果不进行事务提交,那么查询的结果会有缓存,而我们平时使用@transaction开启事务,实际上开启的事务是注册到spring容器上下文创建的EntityManager实例(下面会说明),并不是我在config类中创建的EntityManager实例,