我有大量的CSV文件(每个文件包含大约数百万条记录)。 所以我使用seda来使用多线程功能。我分块50000,处理它并获得一个实体对象列表,我想用jpa将其拆分并保存到数据库中。最初我得到了一个Out of Heap Memory Exception。但后来我使用了高配置系统,Heap问题得到了解决。
但是现在问题是,我正在将重复的记录插入到数据库中。如果csv中有1000000条记录,则大约有2000000条记录被插入到DB中。 Csv文件中的记录没有主键。所以我使用了hibernate来为它生成主键。
下面是我的代码(came-context.xml)
<camelContext xmlns="http://camel.apache.org/schema/spring">
<route>
<from uri="file:C:\Users\PPP\Desktop\input?noop=true" />
<to uri="seda:StageIt" />
</route>
<route>
<from uri="seda:StageIt?concurrentConsumers=1" />
<split streaming="true">
<tokenize token="\n" group="50000"></tokenize>
<to uri="seda:WriteToFile" />
</split>
</route>
<route>
<from uri="seda:WriteToFile?concurrentConsumers=8" />
<setHeader headerName="CamelFileName">
<simple>${exchangeId}</simple>
</setHeader>
<unmarshal ref="bindyDataformat">
<bindy type="Csv" classType="target.bindy.RealEstate" />
</unmarshal>
<split>
<simple>body</simple>
<to uri="jpa:target.bindy.RealEstate"/>
</split>
</route>
请帮助。
答案 0 :(得分:1)
你是否可能意外地开始2个上下文,所以路线运行两次?如果你如何开始这条路线?
答案 1 :(得分:1)
我认为问题可能在于“?noop = true”。因为这不会移动正在处理的文件。因此,Camel将一次又一次地使用该文件。您是否尝试删除此选项,以便Camel将此文件移动到.camel子目录?默认情况下,Camel不会处理“隐藏”目录中的文件 - 以DOT开头的文件。您还可以添加“?moveFailed = .failed”作为预防措施,因此文件将始终移动到目录,即使它们失败。如果这有帮助,请告诉我。
R上。
答案 2 :(得分:0)
要消除数据库中的重复项,您可以从记录内容的哈希创建主键,而不是使用休眠来生成随机数据。
答案 3 :(得分:0)
将此noop.flag: true 添加到yml文件中,它将标记骆驼处理的文件并且不会再次处理它,您也可以在处理d文件后立即指定目标位置,它移动一个副本,然后您执行手动删除方法以从源文件夹中删除处理过的文件。调度程序最好能实现它