Windows服务中的“连接的当前状态已关闭”异常

时间:2015-05-18 10:15:51

标签: sql .net sql-server sql-server-2008

我在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毫秒查询一次数据库。

我预感它与公司网络有关,因为该异常首先出现在数据库迁移后的星期一早上。当公司网络中的流量较低时(周末和晚上) - 服务正常运行。

无论如何,我在这里错过了一些东西吗?难道我做错了什么?我应该关闭这种服务中的连接吗?这个例外可以掩盖其他东西吗?为什么会这么随意发生?

0 个答案:

没有答案