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(Nullable
1 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秒近くかかるはずです。