[英]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.