0

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

4

0 回答 0