我们正在编写一组Spring Batch作业,这些作业从文本文件中读取值,并使用该信息更新使用JPA从数据库读取和写入的对象。这些作业不在Web容器中运行,但在应用程序服务器上运行。我的问题似乎与EntityManager
的配置方式有关。
代码从不同供应商处读取更新订单状态的文件。文本文件按名称指定客户,按日期/时间指定订单。如果客户不存在,则跳过文本文件中的行。如果订单存在,我们会更新它。如果没有,那么我们创建它。
我们目前使用DeltaSpike来获取DAO对象的实例,如下所示:
DependentProvider<CustomerDaoImpl> provider = BeanProvider.getDependent(CustomerDaoImpl.class);
ICustomerDao custDao = provider.get();
我将DAO对象缓存在我的映射器中,所以我只获取它们一次。但每次拨打BeanProvider.getDependent()
都会创建一个新的EntityManager
到#34; Spring Batch Magic。&#34;因此指定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
吗?