繁体   English   中英

无法从传输连接异常中读取数据

[英]Unable to read data from the transport connection exception

我有一个使用实体框架4.3,MySQL连接器6.5.4的MySQL 5.5数据库服务器。

我看到的问题是,通过慢速连接(〜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(Exception 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(驱动程序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实体命令,CommandBehavior行为)

---内部异常堆栈跟踪的结尾---

在System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand实体命令,CommandBehavior行为)

在System.Data.Objects.Internal.ObjectQueryExecutionPlan.Execute [TResultType](ObjectContext上下文,ObjectParameterCollection参数值)处

在System.Data.Objects.ObjectQuery 1.GetResults(Nullable 1)

在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秒的时间进行传输。

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

net_read_timeout

net_write_timeout

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM