Вставка записи в db mule esb с использованием конечной точки файла

У меня есть один запрос относительно вставки записи в базу данных с использованием конечной точки файла. Я хочу вставить запись типа json в db. Я создаю файл json и все эти данные файла, которые я вставил в базу данных. Мой запрос: я могу успешно вставить все эти данные в базу данных, но данные вставляются постоянно, и возникает ошибка. Дублирующаяся запись «1» для ключа «PRIMARY»
Как я могу решить эту ошибку? Я не хочу рекурсивно вставлять данные .Как я могу сделать это только один раз? Я использовал следующий поток

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

пожалуйста, помогите мне


person user3855589    schedule 30.12.2014    source источник


Ответы (3)


Вы можете использовать идемпотентный фильтр сообщений (после разделителя), чтобы убедиться, что повторяющиеся записи отбрасываются. Если ваше представление 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>

Дополнительные сведения см. в следующем справочном материале.

person Nuno    schedule 30.12.2014
comment
Спасибо за ответ. Я могу это решить. но я хочу остановить свою казнь. Это все еще продолжается. Как я могу это решить? - person user3855589; 30.12.2014
comment
Судя по вашей информации, проблема в том, что вы несколько раз обрабатываете один и тот же файл. Если вы обновляете базу из разных файлов, используйте фильтр перед сплиттером по имени файла или его хэшу (при этом уже обработанные файлы будут отброшены). Если вы используете тот же файл (обновляя его новым содержимым), вам необходимо использовать решение в этом ответе. - person Nuno; 30.12.2014
comment
не могли бы вы привести пример? какой фильтр я должен использовать и как я могу узнать, что файл уже обработан?? - person user3855589; 30.12.2014
comment
Другим решением является настройка конечной точки файла для перемещения или переименования (для отказа от шаблона имени) обработанных файлов. Таким образом вы гарантируете, что уже обработанные файлы больше не попадут в конечную точку. - person Nuno; 30.12.2014

Лично я бы попытался избежать идемпотентного фильтра с простым хранилищем сообщений, поскольку он предотвратит возможные скрытые обновления данных в БД.

Если ваша СУБД поддерживает это, я бы попробовал использовать механизм UPSERT, который эффективно сделает ваш запрос идемпотентным. Это можно сделать с помощью этого в postgresql и с помощью этого в mysql.

person Víctor Romero    schedule 30.12.2014

Вы можете легко проверить дубликаты, используя запросы .ack в Mule...

.ack — это запрос, который автоматически запускается сразу после обычного запроса...

Вам нужно создать запрос .ack, который будет запускаться сразу после вашего запроса на вставку и будет проверять уже вставленные строки и устанавливать флаг...

Узнайте здесь, как это сделать с запросом .ack: - http://training.middlewareschool.com/mule/database-transport/
и здесь: - http://www.mulesoft.org/documentation/display/current/JDBC+Transport+Reference#JDBCTransportReference-Acknowledgment

person Anirban Sen Chowdhary    schedule 30.12.2014
comment
Спасибо за ответ. Есть ли другой способ? потому что я не хочу создавать дополнительный столбец (как флаг) в моей базе данных - person user3855589; 30.12.2014