我在Windows Server 2008 R2上有一个Windows服务,它从数据库中读取一些数据并将其缓存到一个文本文件,该文件通过IIS提供给客户端。
在我将数据库迁移到同一服务器机房中不同计算机上的Windows Server 2012之前,它一直运行良好。
现在该服务正常运行,但在30到60分钟内,它会因异常而崩溃 “ExecuteReader需要一个开放且可用的连接。连接的当前状态已关闭。”。
这是我的数据库处理库中的代码:
public SqlDataReader GetReader(string sp, object parameters, ref object output) {
SqlDataReader reader;
using (var command = GetCommand(sp, parameters, ref output)) {
reader = command.ExecuteReader();
if (output != null) SetOutputParameters(command, ref output);
}
return reader;
}
private SqlCommand GetCommand(string sp, object parameters, ref object output) {
SqlCommand command;
command = Connection.CreateCommand();
command.CommandType = CommandType.StoredProcedure;
command.CommandText = sp;
if (parameters != null) AddParameters(command, parameters);
if (output != null) AddOutputParameters(command, ref output);
command.CommandTimeout = CommandTimeout;
if (Connection.State != ConnectionState.Open) Connection.Open();
return command;
}
如您所见,如果状态尚未打开,则显式打开连接(在GetCommand(...)
方法中)。我不会在我的代码中的任何地方关闭连接,因为此服务每隔500毫秒查询一次数据库。
我预感它与公司网络有关,因为该异常首先出现在数据库迁移后的星期一早上。当公司网络中的流量较低时(周末和晚上) - 服务正常运行。
无论如何,我在这里错过了一些东西吗?难道我做错了什么?我应该关闭这种服务中的连接吗?这个例外可以掩盖其他东西吗?为什么会这么随意发生?