我们正在编写一组 Spring Batch 作业,它们从文本文件中读取值并使用该信息来更新使用 JPA 从数据库中读取和写入的对象。这些作业不是在 Web 容器中运行,而是在应用程序服务器上运行。我的问题似乎与EntityManager
配置方式有关。
该代码从各个供应商处读取更新订单状态的文件。文本文件按名称指定客户,按日期/时间指定订单。如果客户不存在,则跳过文本文件中的行。如果订单存在,我们会更新它。如果没有,那么我们创建它。
我们目前使用 DeltaSpike 来获取我们的 DAO 对象的实例,如下所示:
DependentProvider<CustomerDaoImpl> provider = BeanProvider.getDependent(CustomerDaoImpl.class);
ICustomerDao custDao = provider.get();
我在我的映射器中缓存了 DAO 对象,所以我只得到它们一次。但是每次调用都会通过“Spring Batch Magic”BeanProvider.getDependent()
创建一个新的。是这样指定EntityManager
的:EntityManager
@Configuration
public class BaseBatchConfiguration {
@Bean
@Produces
public EntityManager entityManager() {
Map<String, String> properties = new HashMap<String, String>();
properties.put("hibernate.connection.url", System.getProperty("JDBC_URL"));
properties.put("hibernate.default_schema", System.getProperty("APP_SCHEMA"));
properties.put("hibernate.connection.username", System.getProperty("APP_DB_ID"));
properties.put("hibernate.connection.password", System.getProperty("APP_DB_PWD"));
EntityManagerFactory emf = Persistence.createEntityManagerFactory(System.getProperty("PU_NAME"), properties);
return emf.createEntityManager();
}
}
我尝试缓存,但每次都使用该类EntityManager
的新实例。BaseBatchConfiguration
这意味着每个 DAO 都是用它自己的 创建的EntityManager
,因此 DAO 之间不会发生真正的对象缓存(在加载引用同一客户的订单CustomerDaoImpl
时,不会缓存和使用带有 的客户)。OrderDaoImpl
当我们处理文本文件时,这会导致大量不需要的对象加载。
还有其他我们应该声明的方式EntityManager
吗?