1

過去 2 年間、私たちは ASP.NET MVC 3、NHibernate (v. 3.3.1.4000)、およびバックエンド データベース用の PostgreSql を使用して Web ベースのアプリケーションを開発してきたため、Npgsql ドライバー (v. 2.0.12.0) を使用しています。システムは 4 つの異なるクライアント サーバーで悪用に成功しており、最近セットアップした新しいサーバーで発生したエラーは一度も発生していません。例外は、データの初期作成時に 1 回だけ発生し、一部のビジネス エンティティが 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()
4

2 に答える 2

0

これは Npgsql 内のバグのようです。

スタックトレース (および Npgsql コードの確認: https://github.com/npgsql/Npgsql/blob/master/src/Npgsql/NpgsqlDataReader.cs#L1163 ) によると、GetNextResponseObject() 内でエラーが発生すると、Npgsql はメッセージをサーバーに同期して、会話を一貫した状態にリセットします。問題は、このエラーが発生した場合、一部のデータがストリームに残っている可能性があり、Npgsql がそれに書き込もうとすると、バッファリングされたストリームがデータがまだあるかどうかを確認し、データをフラッシュしている間に、シークを呼び出そうとすることです。 t ネットワーク ストリーム (バッファ ストリームが作成される) によってサポートされます。

このバグの可能な修正は、バッファリングされたストリームに書き込む前に、残っている可能性のあるデータからバッファリングされたストリームをフラッシュすることです。

この変更でプル リクエストを作成します。

最大の問題は、お気づきのように、このタイプまたはエラーが非常にまれであることです。このエラーは一度だけ発生しました。そもそも例外がスローされた原因をさらに調査する必要があります。

お役に立てば幸いです。

于 2013-11-16T02:14:22.823 に答える