2014-12-30 40 views
0

我有一个关于使用文件端点在数据库中插入记录的查询。 我想在数据库中插入json类型的记录。我创建了json文件以及我插入数据库的所有这些文件数据。我的查询是我可以在数据库中成功插入所有这些数据,但是这是不断插入数据和发生错误键'PRIMARY'重复条目'1'
我该如何解决这个错误?我不想插入数据递归。我怎么做只有一次? 我用下面的流程使用文件端点在db mule esb中插入记录

**File->Json to Object->Splitter->Database** 

请帮我

回答

1

您可以使用幂等消息过滤器(在分离器之后)以确保丢弃重复的条目。如果JSON表示具有唯一的标识符,可使用幂等报文过滤器

<idempotent-message-filter idExpression="#[entry.id]"> 
    <simple-text-file-store directory="./idempotent"/> 
</idempotent-message-filter> 

否则,使用幂等安全散列消息筛选(其将基于其散列值过滤消息)

<idempotent-secure-hash-filter messageDigestAlgorithm="SHA26"> 
    <simple-text-file-store directory="./idempotent"/> 
</idempotent-secure-hash-message-filter> 

欲了解更多信息,请检查以下reference

+0

感谢您的回复。我可以解决它。但我想停止执行。它还在继续..我可以如何解决这个问题? – user3855589

+0

考虑到您的信息,问题在于您正在处理同一个文件多次。如果您从不同文件更新数据库,请在分隔符之前使用过滤器对文件名或其哈希值(这会丢弃已处理的文件)。如果你使用相同的文件(用新内容更新它),那么你必须在这个答案中使用解决方案。 – Nuno

+0

你能给我举个例子吗?我必须使用哪个过滤器,以及如何知道已经处理过的文件? – user3855589

0

你可以很容易地检查使用域.Ack查询在骡子的重复...

域.Ack是运行即时查询正常后自动查询...

您需要创建.ack查询,它将在插入查询后立即运行,并将che CK行已经插入,并设置标志...

检查这里怎么用域.Ack查询做到这一点: - http://training.middlewareschool.com/mule/database-transport/
这里: - http://www.mulesoft.org/documentation/display/current/JDBC+Transport+Reference#JDBCTransportReference-Acknowledgment

+0

谢谢reply.Is还有其他方法吗?因为我不想在我的数据库中创建额外的列(如标志) – user3855589

1

就我个人而言,我会尽量避免使用简单消息存储的幂等过滤器,因为它会阻止数据库中数据的潜在更新更新。

如果你的数据库管理系统支持它,我会尝试使用UPSERT机制,这将有效地呈现你的查询idempotent。这可以通过postgresql以及mysql来完成。