1

我有一个 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(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 源)

在 IceCream.Repository.GetDessertData(Int64 dessertId) 在 ....

另一个数据点 - 我可以使用相同大小的 blob 调用连续两次添加的方法,但我没有收到此错误(或等效错误)。仅当我执行添加然后使用检索跟进时才会发生这种情况。

任何想法如何解决这个问题?我曾认为将命令超时值设置为 0 可以解决我的问题,但事实并非如此。

编辑

另一点是我做了数学计算,192mbs 的 3 兆字节应该需要大约 128 秒的时间来传输。

4

1 回答 1

3

因此,经过大量搜索和阅读,我调整了 my.ini 文件中的以下值:

net_read_timeout

net_write_timeout

通过将它们设置为值99999并重新启动我的数据库服务器,我现在可以通过慢速连接检索该 3M 文件,而不会发生进一步的事件。

于 2012-09-13T18:03:44.697 回答