テキストファイルから値を読み取り、その情報を使用して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
か?