0

テキストファイルから値を読み取り、その情報を使用してJPAを使用してデータベースから読み書きされるオブジェクトを更新する一連のSpring Batchジョブを作成しています。これらのジョブはWeb コンテナーではなく、アプリケーション サーバーで実行されます。私の問題は、のEntityManager構成方法にあるようです。

このコードは、注文のステータスを更新するさまざまなベンダーからファイルを読み取ります。テキスト ファイルでは、顧客を名前で指定し、順序を日付/時間で指定します。顧客が存在しない場合、テキスト ファイルの行はスキップされます。注文が存在する場合は、更新します。そうでない場合は、作成します。

現在、DeltaSpike を使用して、次のように DAO オブジェクトのインスタンスを取得しています。

DependentProvider<CustomerDaoImpl> provider = BeanProvider.getDependent(CustomerDaoImpl.class);
ICustomerDao custDao = provider.get();

DAO オブジェクトをマッパーにキャッシュするので、取得は 1 回だけです。しかし、 を呼び出すたびに、「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