Проблема с тайной вставкой данных в nHibernate - PullRequest
0 голосов
/ 17 ноября 2010

У меня здесь странный вопрос.Я использую nhibernate, и моя проблема заключается в том, что при больших вставках данных не генерируются исключения, в таблице нет данных, НО ключи идентификации используются.Поэтому, когда я вручную вставляю следующую запись, идентификационный ключ пропускает несколько слов, как если бы данные были импортированы и удалены?!?!

Вот некоторые моменты, на которые следует обратить внимание: - Я выбираю данные из веб-службы, поэтомукаждому элементу требуется некоторое время, прежде чем он будет вызван make persistent - в зависимости от элемента это либо вставка, либо обновление - я использую foreach для итерации по извлеченной коллекции перед проверкой, чтобы проверить, является ли она обновлением или вставкой (т.е.Я пытаюсь заполнить сущность или создать новый экземпляр, а затем вызвать make persistent в конце.) - код работает, когда данные вставляются небольшими партиями и видны в базе данных.Для импорта, который занимает немного больше времени, чем завершается, без каких-либо исключений, но данные не видны, а только ключ к тому, что идентификационный ключ был занят тем, что было бы вставлено и видно.

Может кто-нибудь объяснить, чтоздесь происходит?Поскольку я не получаю никаких исключений, у меня нет возможности диагностировать это, любая помощь или предложение очень ценятся!

Ответы [ 3 ]

0 голосов
/ 17 ноября 2010

Какова ваша стратегия генерации ПК?(Знание этого может помочь объяснить, почему используются PK.) Вдруг мне кажется, что ваша транзакция истекает.Несколько способов обойти это ...

  • Включить пакетное обновление через adonet.batch_size в hibernate.cfg.xml, если ваш провайдер базы данных поддерживает это.Поставщики SQL Server и Oracle определенно делают.Многие другие этого не делают.
  • Извлекайте все данные из веб-службы и не начинайте вставлять / обновлять ваши объекты, пока у вас не будут все данные.Это поможет сократить ваши транзакции в БД, так как вы не будете ждать в веб-службе.
  • Рассмотрите возможность разделения одного большего пакета на несколько меньших пакетов, если ваша бизнес-логика позволяет это.Так как меньшие партии работают, возможно, имеет смысл зафиксировать вашу транзакцию и начать новую каждые X элементов.
0 голосов
/ 18 ноября 2010

Первичные ключи с IDENTITY и откат транзакции объяснили бы отсутствующие ключи.Они были вставлены, а затем снова удалены, либо из-за более поздней ошибки, вызвавшей откат, либо из-за превышения времени ожидания транзакции, как предлагает Джеймс.Это обсуждается здесь .

Ваша настоящая проблема, кажется, молчаливая ошибка.Вы подавляете исключения с пустым уловом?Может ли ваш улов бросить исключение?Если вы еще этого не сделали, я рекомендую добавить log4net в ваш проект с помощью простого файлового приложения (приемника).NHibernate записывает все, что он делает, в log4net, если он присутствует (полезно для отладки, но не оставляйте его включенным в работе).В качестве альтернативы, как уже предлагалось, вы можете профилировать свой SQL.

0 голосов
/ 17 ноября 2010

От макушки головы я не могу думать о том, что может происходить.У вас есть профилировщик SQL?Если вы это сделаете и можете последовательно воспроизвести эту проблему, запустив средство профилирования, пока оно происходит, вам следует указать, что происходит.Если нет, вы можете написать триггеры вставки / удаления, чтобы отслеживать, что происходит в таблице.

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