我有一个 MySQL 5.5 DB 服务器,使用 Entity Framework 4.3,MySQL Connector 6.5.4。
我看到的问题是通过慢速连接(~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;
}
(还有一些其他构造函数用于不同的超时,但这可能与讨论无关)
我放入甜点数据表的 blob 大小约为 3 兆字节。
当我的连接速度不慢时,我看不到这个问题。
我得到的例外是:
System.Data.EntityCommandExecutionException:执行命令定义时出错。有关详细信息,请参阅内部异常。
---> MySql.Data.MySqlClient.MySqlException: 命令执行过程中遇到致命错误。
---> MySql.Data.MySqlClient.MySqlException:尝试读取结果集时遇到致命错误。
---> MySql.Data.MySqlClient.MySqlException:从流中读取失败。
---> System.IO.IOException: Unable to read data from the transport connection: 一个现有的连接被远程主机强行关闭。---> System.Net.Sockets.SocketException: 现有连接被远程主机强行关闭
在 System.Net.Sockets.NetworkStream.Read(字节 [] 缓冲区,Int32 偏移量,Int32 大小)
--- 内部异常堆栈跟踪结束 ---
在 MySql.Data.Common.MyNetworkStream.HandleOrRethrowException(异常 e)
在 MySql.Data.Common.MyNetworkStream.Read(字节 [] 缓冲区,Int32 偏移量,Int32 计数)
在 MySql.Data.MySqlClient.TimedStream.Read(字节 [] 缓冲区,Int32 偏移量,Int32 计数)
在 System.IO.BufferedStream.Read(字节 [] 数组,Int32 偏移量,Int32 计数)
在 MySql.Data.MySqlClient.MySqlStream.ReadFully(流流,字节 [] 缓冲区,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(驱动程序 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 上下文,ObjectParameterCollection 参数值)
在 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 源)
在 IceCream.Repository.GetDessertData(Int64 dessertId) 在 ....
另一个数据点 - 我可以使用相同大小的 blob 调用连续两次添加的方法,但我没有收到此错误(或等效错误)。仅当我执行添加然后使用检索跟进时才会发生这种情况。
任何想法如何解决这个问题?我曾认为将命令超时值设置为 0 可以解决我的问题,但事实并非如此。
编辑
另一点是我做了数学计算,192mbs 的 3 兆字节应该需要大约 128 秒的时间来传输。