2013-11-12 2 views
1

В течение последних двух лет мы разрабатывали веб-приложение с ASP.NET MVC 3, NHibernate (v. 3.3.1.4000) и PostgreSql для базы данных, поэтому с использованием драйвера Npgsql (версия 2.0.12.0). Система успешно работает на 4 разных клиентских серверах и никогда не создавала ошибку, с которой я столкнулся на новом сервере, который мы установили недавно. Исключение произошло только один раз, после первоначальной совокупности с данными и не позволило некоторым бизнес-единицам быть сохраненными в БД. Я действительно должен убедиться, что в будущем ошибка будет надлежащим образом обработана, если вообще не удастся избежать, но как-то не понимаю. Поиск на сайте и в интернете в целом для этой или подобных ошибок не привел никакой информации. Кто-нибудь из вас столкнулся с этой проблемой или у вас есть идея, как ее исправить? Спасибо :)Npgsql вызывает System.NotSupportedException

Вот ошибка:

System.NotSupportedException: This stream does not support seek operations. 
    at System.Net.Sockets.NetworkStream.Seek(Int64 offset, SeekOrigin origin) 
    at System.IO.BufferedStream.FlushRead() 
    at System.IO.BufferedStream.WriteByte(Byte value) 
    at Npgsql.NpgsqlSync.WriteToStream(Stream outputStream) 
    at Npgsql.NpgsqlReadyState.SyncEnum(NpgsqlConnector context) 
    at Npgsql.NpgsqlState.Sync(NpgsqlConnector context) 
    at Npgsql.ForwardsOnlyDataReader.GetNextResponseObject() 
    at Npgsql.ForwardsOnlyDataReader.GetNextRowDescription() 
    at Npgsql.ForwardsOnlyDataReader.NextResult() 
    at Npgsql.ForwardsOnlyDataReader..ctor(IEnumerable`1 dataEnumeration, CommandBehavior behavior, NpgsqlCommand command, NotificationThreadBlock threadBlock, Boolean synchOnReadError) 
    at Npgsql.NpgsqlCommand.GetReader(CommandBehavior cb) 
    at Npgsql.NpgsqlCommand.ExecuteNonQuery() 
    at NHibernate.AdoNet.AbstractBatcher.ExecuteNonQuery(IDbCommand cmd) 
    at NHibernate.AdoNet.NonBatchingBatcher.AddToBatch(IExpectation expectation) 
    at NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object id, Object[] fields, Boolean[] notNull, Int32 j, SqlCommandInfo sql, Object obj, ISessionImplementor session) 
    at NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object id, Object[] fields, Object obj, ISessionImplementor session) 
    at NHibernate.Action.EntityInsertAction.Execute() 
    at NHibernate.Engine.ActionQueue.Execute(IExecutable executable) 
    at NHibernate.Engine.ActionQueue.ExecuteActions(IList list) 
    at NHibernate.Engine.ActionQueue.ExecuteActions() 
    at NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions(IEventSource session) 
    at NHibernate.Event.Default.DefaultFlushEventListener.OnFlush(FlushEvent event) 
    at NHibernate.Impl.SessionImpl.Flush() 
    at NHibernate.Transaction.AdoTransaction.Commit() 
+0

И это вызвано тем, какой код? –

+0

К сожалению, я не знаю. Ошибка произошла в производстве, и это то, что у меня есть из журналов. Внутреннего исключения нет. –

ответ

3

Поскольку трассировки стека происходит от NHibernate.Transaction.AdoTransaction.Commit, что означает эта ошибка, вероятно, вошли самой NHibernate. Ваше приложение должно выполнять свою собственную регистрацию, так что вы можете иметь ...

  • детали на наличие ошибок, которые происходят за пределами NHibernate
  • лучше контекст для ошибок, пузыриться от NHibernate, как тот, что вы столкнулись

См. «log all unhandled application errors» и «exception handling should never hide issues» для получения справки по внедрению этого типа ведения журнала.

Без дополнительной информации о коде, который сгенерировал эту ошибку, будет практически невозможно исправить. Фиксация кода регистрации и обработки исключений должна быть одним из главных приоритетов при работе с новой базой кода, чтобы фактически иметь шанс сражаться, чтобы исправить ошибки и улучшить код.

+0

Привет, спасибо за ответ. У нас есть настройка log4net, так что для всех слоев приложения у нас есть разные файлы журналов, а для бизнес-уровня - все выше INFO. NHibernate, который поддерживает log4net изначально, также имеет свой собственный журнал и журналы все выше INFO. Это этот журнал, что я получил ошибку, указанную выше.Меня беспокоит то, что он не имеет внутреннего исключения и, похоже, имеет какое-то отношение к тому, как Npgsql обрабатывает определенную ситуацию. Какие-нибудь догадки? –

+0

Тогда исключение, вероятно, будет проглочено блоком 'try ... catch'. Найдите 'ITransaction.Commit()' в окружении 'try ... catch'. –

0

Это, кажется, ошибка внутри Npgsql.

В соответствии с stacktrace (и проверкой кода Npgsql: https://github.com/npgsql/Npgsql/blob/master/src/Npgsql/NpgsqlDataReader.cs#L1163), когда ошибка возникает внутри GetNextResponseObject(), Npgsql отправляет сообщение Sync на сервер для сброса разговора в согласованное состояние. Проблема заключается в том, что при возникновении этой ошибки некоторые данные могут быть оставлены в потоке, и когда Npgsql пытается записать на него, буферизованный поток проверяет, есть ли еще данные и, при промывке данных, пытается вызвать поиск, который isn ' t, поддерживаемый сетевым потоком (по которому создается буферный поток).

Возможное исправление этой ошибки - очистить буферный поток от любых возможных данных, оставшихся перед записью.

Я создам запрос на тяну с этим изменением.

Самая большая проблема в том, что этот тип или ошибка очень редки, как вы заметили. Эта ошибка произошла только один раз для вас. Мне нужно будет расследовать больше, что вызвало исключение исключения в первую очередь.

Надеюсь, это поможет.

 Смежные вопросы

  • Нет связанных вопросов^_^