1

Entity Framework 4.3、MySQLConnector6.5.4を使用するMySQL5.5DBサーバーがあります。

私が見ている問題は、遅い接続(〜192kbs)ではかなり一貫しているように見えることです。

シナリオは、最初に次のようなメソッドを呼び出すことです。

using (var db = new IceCreamEntities(ConnectionString, null, null, null, "infinite timeout"))
{
   db.desserts.Add(myDessert);
   db.SaveChanges()

   db.dessertData.Add(new dessertBlob() { DessertId = myDessert.Id, Data = someData });
}

その後、それを取り戻すためのメソッドを(たとえば、30秒以内に)厳密に呼び出します。次のようになります。

using (var db = new IceCreamEntities(ConnectionString, null, null, null, "infinite timeout"))
{
   var myDessertData = db.dessertData.Where(m => m.DessertId == myId).FirstOrDefault();
   return myDessertData;
}

ここで、IceCreamEntities私が使用しているコンストラクター呼び出しは次のことを行います。

public IceCreamEntities(string connectionString, string unused2, string unused3, string unused4, string forLongRunningStuff)
: base(connectionString)
{
   var objectContext = (this as IObjectContextAdapter).ObjectContext;
   objectContext.CommandTimeout = 0;
}

(異なるタイムアウトで使用される他のコンストラクターがいくつかありますが、それはおそらく議論に密接に関係していません)

そのdessertDataテーブルに入れているblobのサイズは約3メガバイトです。

接続が遅いときは、この問題は発生しません。

私が得る例外は次のとおりです。

System.Data.EntityCommandExecutionException:コマンド定義の実行中にエラーが発生しました。詳細については、内部例外を参照してください。

---> MySql.Data.MySqlClient.MySqlException:コマンドの実行中に致命的なエラーが発生しました。

---> MySql.Data.MySqlClient.MySqlException:結果セットを読み取ろうとして致命的なエラーが発生しました。

---> MySql.Data.MySqlClient.MySqlException:ストリームからの読み取りに失敗しました。
---> System.IO.IOException:トランスポート接続からデータを読み取れません:既存の接続がリモートホストによって強制的に閉じられました。

---> System.Net.Sockets.SocketException:既存の接続がリモートホストによって強制的に閉じられました

System.Net.Sockets.NetworkStream.Read(Byte []バッファー、Int32オフセット、Int32サイズ)

---内部例外スタックトレースの終わり---

MySql.Data.Common.MyNetworkStream.HandleOrRethrowException(例外e)で

MySql.Data.Common.MyNetworkStream.Read(Byte []バッファー、Int32オフセット、Int32カウント)

MySql.Data.MySqlClient.TimedStream.Read(Byte []バッファー、Int32オフセット、Int32カウント)

System.IO.BufferedStream.Read(Byte []配列、Int32オフセット、Int32カウント)

MySql.Data.MySqlClient.MySqlStream.ReadFully(ストリームストリーム、Byte []バッファー、Int32オフセット、Int32カウント)

MySql.Data.MySqlClient.MySqlStream.LoadPacket()で

---内部例外スタックトレースの終わり---

MySql.Data.MySqlClient.MySqlStream.LoadPacket()で

MySql.Data.MySqlClient.MySqlStream.ReadPacket()で

MySql.Data.MySqlClient.NativeDriver.FetchDataRow(Int32 statementId、Int32列)で

MySql.Data.MySqlClient.Driver.FetchDataRow(Int32 statementId、Int32列)で

MySql.Data.MySqlClient.ResultSet.GetNextRow()で

MySql.Data.MySqlClient.ResultSet..ctor(Driver d、Int32 statementId、Int32 numCols)で

MySql.Data.MySqlClient.Driver.NextResult(Int32 statementId、ブール値の力)で

MySql.Data.MySqlClient.MySqlDataReader.NextResult()で

---内部例外スタックトレースの終わり---

MySql.Data.MySqlClient.MySqlDataReader.NextResult()で

MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehaviorの動作)で

---内部例外スタックトレースの終わり---

MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehaviorの動作)で

MySql.Data.Entity.EFMySqlCommand.ExecuteDbDataReader(CommandBehaviorの動作)で

System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand、CommandBehaviorの動作)で

---内部例外スタックトレースの終わり---

System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand、CommandBehaviorの動作)で

System.Data.Objects.Internal.ObjectQueryExecutionPlan.Execute [TResultType](ObjectContext context、ObjectParameterCollection parameterValues)で

System.Data.Objects.ObjectQuery 1.GetResults(Nullable1 forMergeOptionで)

System.Data.Objects.ObjectQuery`1.System.Collections.Generic.IEnumerable.GetEnumerator()で

System.Linq.Enumerable.FirstOrDefault [TSource](IEnumerable`1ソース)で

System.Data.Entity.Internal.Linq.DbQueryProvider.Execute [TResult](式)で

System.Linq.Queryable.FirstOrDefault [TSource](IQueryable`1 source)で

IceCream.Repository.GetDessertData(Int64 dessertId)で...。

もう1つのデータポイント-同じサイズのblobを使用して2回続けて加算を行うメソッドを呼び出すことができますが、このエラー(または同等のもの)は発生しません。これは、追加を実行してから取得でフォローアップした場合にのみ発生します。

これに対処する方法はありますか?コマンドのタイムアウト値を0に設定すると問題が解決すると思っていましたが、解決しません。

編集

もう1つのポイントは、私が計算を行ったということです。192mbsで3メガバイトを転送するには、128秒近くかかるはずです。

4

1 に答える 1

3

そのため、多くの検索と読み取りを行った後、my.iniファイルで次の値を調整しました。

net_read_timeout

net_write_timeout

それらを値99999に設定し、データベースサーバーを再起動することで、低速接続を介してその3Mファイルをさらに問題なく取得できるようになりました。

于 2012-09-13T18:03:44.697 に答える