使用Apache Camel将来自csv的重复值插入到DB中

时间:2016-03-24 15:06:58

标签: csv apache-camel

我有大量的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>

请帮助。

4 个答案:

答案 0 :(得分:1)

你是否可能意外地开始2个上下文,所以路线运行两次?如果你如何开始这条路线?

答案 1 :(得分:1)

我认为问题可能在于“?noop = true”。因为这不会移动正在处理的文件。因此,Camel将一次又一次地使用该文件。您是否尝试删除此选项,以便Camel将此文件移动到.camel子目录?默认情况下,Camel不会处理“隐藏”目录中的文件 - 以DOT开头的文件。您还可以添加“?moveFailed = .failed”作为预防措施,因此文件将始终移动到目录,即使它们失败。如果这有帮助,请告诉我。

R上。

答案 2 :(得分:0)

要消除数据库中的重复项,您可以从记录内容的哈希创建主键,而不是使用休眠来生成随机数据。

答案 3 :(得分:0)

将此noop.flag: true 添加到yml文件中,它将标记骆驼处理的文件并且不会再次处理它,您也可以在处理d文件后立即指定目标位置,它移动一个副本,然后您执行手动删除方法以从源文件夹中删除处理过的文件。调度程序最好能实现它