使用Spring Batch FieldSetMapper映射到将使用JpaItemWriter编写的对象的性能问题?

时间:2015-10-13 17:00:17

标签: jpa spring-batch deltaspike

我们正在编写一组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吗?

0 个答案:

没有答案