我们有两台服务器。应用程序服务器和SQL服务器。TDS流中的协议错误 - 错误
当运行从应用服务器这个简单的程序:
static void Main(string[] args)
{
OleDbCommand cmd;
OleDbConnection cnn;
string connectionString = "Provider=SQLNCLI10;Integrated Security=SSPI;User ID=***;Password=***;Persist Security Info=False;Initial Catalog=MCS_BATCH;Data Source=CD6S01;Initial File Name=;";
string sql = "EXEC [msp].[MasterMSP] @BTYPE = N'B_PVM_KNN', @AC_KEY = NULL, @RUN_TS = '2014-05-02 17:29:31.1400555', @CHUNK_ID = 8794";
System.IO.StreamWriter file = new System.IO.StreamWriter("MasterMSP_output.txt");
cnn = new OleDbConnection(connectionString);
try
{
cnn.Open();
cmd = new OleDbCommand(sql, cnn);
try
{
OleDbDataReader reader = cmd.ExecuteReader();
int numberOfFields = reader.VisibleFieldCount;
StringBuilder sb = new StringBuilder();
while (reader.Read())
{
for (int i = 0; i < (numberOfFields - 1); i++)
{
file.Write(reader[i].ToString());
}
file.WriteLine("");
}
file.Close();
}
catch (Exception ex)
{
file.Write("Execption ex at : {0}", System.DateTime.Now);
file.Write(ex.Message.ToString());
Console.WriteLine("Exception ex time is : {0}", System.DateTime.Now);
throw;
}
cmd.Dispose();
cnn.Close();
}
catch (Exception exx)
{
file.Write("Execption exx at : {0}", System.DateTime.Now);
file.Write(exx.Message.ToString());
Console.WriteLine("Exception exx time is : {0}", System.DateTime.Now);
throw;
}
}
我们得到 - 一个 “协议错误的TDS流” 的错误 - 在一段时间后:
我们跑了网络跟踪,我们可以看到“TCP窗口大小”在10分钟后递减,然后发送TCP窗口大小= 0(关闭窗口)。 这意味着,直到它已经得到了更新的窗口大小,大于0,从应用服务器的SQL服务器不能发送更多的数据(右):。
SQL服务器尝试发送1字节Keepalive,但应用程序服务器从不响应。 (问题是应用程序服务器再也不会提高TCP Windows Size,最后应用程序服务器正在终止会话。)
除了它是应用程序服务器故障,它可能是网络缓冲区不在空(刷新)了。 TCP堆栈唯一能做的就是关闭TCP Windows Size,直到应用程序再次清空缓冲区 - 但它从来不会这样做。
任何提示,关于什么问题的想法? 这个问题实际上出现在第三方程序中。该程序正在调用SQL服务器上的存储过程。所以我只是试图在C#程序中重现逻辑,并能够重现错误。
任何帮助,意见或建议,高度赞赏。 感谢
什么程序是从截图? – usr
“CMD”和“Microsoft Network Monitor 3.4” –