Npgsql导致System.NotSupportedException

时间:2013-11-12 07:41:12

标签: postgresql nhibernate npgsql

在过去两年中,我们一直在使用ASP.NET MVC 3,NHibernate(v.3.3.1.4000)和PostgreSql开发基于Web的应用程序,用于后端数据库,因此使用Npgsql驱动程序(v.2.0。 12.0)。该系统已在4个不同的客户端服务器上成功利用,并且从未产生我在最近设置的新服务器上遇到的错误。在具有数据的初始填充时,仅发生一次异常,并且阻止某些业务实体存储到DB。我真的必须确保将来错误得到妥善处理,如果不是可以避免的话,但是我不知道如何。一般针对此类或类似错误搜索网站和互联网不会产生任何信息。你们有没有遇到过这个问题或有想法如何修复它?谢谢:))

这是错误:

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()

2 个答案:

答案 0 :(得分:3)

由于堆栈跟踪源自NHibernate.Transaction.AdoTransaction.Commit,这意味着NHIBnate本身可能会记录此错误。您的应用程序必须自己进行日志记录,以便您可以...

  • NHibernate之外发生的错误的详细信息
  • 从NHibernate中冒出的错误的更好的上下文,就像你遇到过的那样

有关实施此类日志记录的帮助,请参阅“log all unhandled application errors”和“exception handling should never hide issues”。

如果没有关于生成此错误的代码的更多信息,则几乎无法修复此问题。修复日志记录和异常处理代码需要成为使用新代码库时的首要任务之一,以便真正有机会修复错误并改进代码。

答案 1 :(得分:0)

这似乎是Npgsql中的一个错误。

根据stacktrace(并检查Npgsql代码:https://github.com/npgsql/Npgsql/blob/master/src/Npgsql/NpgsqlDataReader.cs#L1163),当GetNextResponseObject()内发生错误时,Npgsql向服务器发送一条Sync消息,将对话重置为一致状态。问题是,当发生此错误时,某些数据可能已留在流中,当Npgsql尝试写入时,缓冲流检查是否还有数据,并且在刷新数据时,尝试调用seek is is' t由网络流支持(在其上创建缓冲流)。

此错误的一个可能修复方法是在写入之前从缓冲流中删除任何可能的数据。

我将使用此更改创建拉取请求。

最大的问题是这种类型或错误非常罕见,正如您所注意到的那样。此错误仅发生一次。我需要先调查一下导致异常被抛出的更多内容。

我希望它有所帮助。