私はSpring MVC 4、Spring Batch 3、Hibernate 5、およびEhcache 2.8を使用しています。 Spring Batchを使用して、1000のチャンクでHibernateを使用してCSVから多くのデータをインポートしています。Springバッチ、EhCache、およびHibernateを使用したデータインポートの漸進的パフォーマンス低下
まず、チャンク間の間隔は10秒以内です。徐々に、約10万アイテム後、アイテム間の間隔は1分以上です。私は、これが徐々に劣化するので、キャッシングの問題ではないかと考えています。私の現在の休止状態の統計がある
- 第二レベルのキャッシュヒット%:97.8839177750907
- クエリキャッシュヒット%:54.206282344445775
- クエリ最大時間:
ここでは、インポートに使用するクエリで4.08s私のehcache.xml設定です
<defaultCache
eternal="false"
timeToIdleSeconds="180"
timeToLiveSeconds="240"
maxEntriesLocalHeap="10000"
maxEntriesLocalDisk="50000"
>
<persistence strategy="localTempSwap" />
</defaultCache>
<cache name="org.hibernate.cache.internal.StandardQueryCache"
maxEntriesLocalHeap="10000"
maxEntriesLocalDisk="50000"
eternal="false"
timeToIdleSeconds="180"
timeToLiveSeconds="240"
>
<persistence strategy="localTempSwap" />
</cache>
<cache name="org.hibernate.cache.spi.UpdateTimestampsCache"
eternal="false"
maxEntriesLocalHeap="0"
/>
[編集]ここはバッチジョブのソースコードです
@Bean
@StepScope
public static FlatFileItemReader<CsvPayment> paymentReader(@Value("#{jobParameters[fullPathFileName]}") String pathToFile,
@Value("#{jobParameters[delimeter]}") String delimeter,
@Value("#{jobParameters[skipItems]}") Long skipItems,
@Value("#{jobParameters[limitItems]}") Long limitItems)
{
FlatFileItemReader<CsvPayment> reader = new FlatFileItemReader<>();
reader.setResource(new FileSystemResource(pathToFile));
reader.setEncoding(GlobalConstants.UTF8);
reader.setMaxItemCount(limitItems.intValue());
reader.setLinesToSkip(skipItems.intValue());
reader.setLineMapper(new CsvPaymentLineMapper(delimeter));
return reader;
}
@Bean("importPayment")
public Job importPayment(ItemReader<CsvPayment> paymentReader)
{
return jobBuilderFactory.get("paymentReader").incrementer(new RunIdIncrementer()).flow(
paymentStep1(paymentReader)).end().build();
}
@Bean
public Step paymentStep1(ItemReader<CsvPayment> paymentReader)
{
return stepBuilderFactory.get("paymentStep1").<CsvPayment, OccupancyPayment> chunk(CHUNK_SIZE).reader(
paymentReader).processor(itemProcessor).faultTolerant().listener(
new ChunkListenerImpl(logger)).writer(itemWriter()).build();
}
@Bean
public HibernateItemWriter<OccupancyPayment> itemWriter()
{
HibernateItemWriter<OccupancyPayment> itemWriter = new HibernateItemWriter<>();
itemWriter.setSessionFactory(sessionFactory);
itemWriter.setClearSession(true);
return itemWriter;
}
うまくいけば、誰かが私に正しい方向を指摘することができます。ありがとう。
第1レベルのキャッシュを消去します。各エンティティが第1レベルのキャッシュに追加され、クエリを発行するたびに、休止状態のオブジェクトの第1レベルキャッシュ(セッション/エンティティマネージャ)がチェックされます。オブジェクトの数が増えるほど時間がかかります。 –
@ M.Deinum Spring Batchで使用しているHibernateItemWriterはAPIで、各書き込みで最初のレベルのキャッシュをクリアしていると言います。私はバッチジョブのソースコードを提供するために投稿を更新します。 –
プロセッサが見つかりません。 –