SQL Azure - 瞬态“ExecuteReader需要打开连接”异常

时间:2013-04-03 07:46:48

标签: sql azure ado.net

我在作为云服务运行的Windows Azure应用程序中使用SQL Azure。大多数情况下,我的数据库操作完全正常(也就是说,在处理各种超时后,不管怎样),但是我遇到的问题似乎是

        using (var connection = new SqlConnection(m_connectionString))
        {
            m_ConnectionRetryPolicy.ExecuteAction(() => connection.Open());
            using (var command = connection.CreateCommand())
            {
                command.CommandText = "SELECT * FROM X WHERE Y = Z";
                var reader = m_CommandRetryPolicy.ExecuteAction(() => command.ExecuteReader());
                return LoadData(reader).FirstOrDefault();
            }
        }

失败的行是带有:

的Command.ExecuteReader
ExecuteReader requires an open and available Connection. The connection's current state is closed

我已经考虑过的事情

  • 我不是“重用”旧连接或保存连接是成员变量
  • 应该没有并发问题 - 每次需要时都会创建这些方法所属的存储库类

还有其他人经历过这个吗?我当然可以将它添加到异常列表中,这将导致重试,但我对此不太满意

5 个答案:

答案 0 :(得分:0)

写下try和catch中的所有内容,最后阻止。

如下:

try
{
con.open();
m_ConnectionRetryPolicy.ExecuteAction(() => connection.Open());
            using (var command = connection.CreateCommand())
            {
                command.CommandText = "SELECT * FROM X WHERE Y = Z";
                var reader = m_CommandRetryPolicy.ExecuteAction(() => command.ExecuteReader());
                return LoadData(reader).FirstOrDefault();
            }
con.close();
}
catch(exception ex)
{
}
finally
{
 con.close();
}

请记住在finally块中关闭连接。

答案 1 :(得分:0)

MS专门为SQL Azure生成了一个企业库,这里有一些来自他们的模式和实践的例子。

它与您正在做的类似,但它在可靠性方面做得更多(这些示例显示了如何获得可靠的连接)

http://msdn.microsoft.com/en-us/library/hh680899(v=pandp.50).aspx

答案 2 :(得分:0)

我几天前(西欧)在我的生产部署中遇到了一些这些错误,但是他们自己就走了。与此同时,我看到了SQL Azure的超时,限制和其他错误。我假设平台存在暂时性问题(或者至少是我正在运行的服务器)。

您可能在代码中没有做错任何事情,但在SQL Azure上的性能下降。尝试并处理错误,执行重试,指数退避,队列(以减少并发),在数据库之间分配负载 - 这类事情。

答案 3 :(得分:0)

你确定读者失败而不是打开连接吗?当我将connection.Open()包裹在m_ConnectionRetryPolicy.ExecuteAction()中时,我遇到了异常。

但是,如果我跳过ExecuteAction包装并使用connection.OpenWithRetry(m_ConnectionRetryPolicy)打开连接,它对我来说就可以了。

我也在使用command.ExecuteReaderWithRetry(m_ConnectionRetryPolicy),这对我有用。

我不知道为什么在包装在ExecuteAction中时为什么它不起作用。

答案 4 :(得分:0)

我相信这意味着Azure已经关闭了幕后的连接,而没有告诉连接更加清晰。这是设计的。因此,连接池会为您提供它认为可用的开放式连接,但是当您尝试使用它时,它会发现它毕竟不会打开。

这对我来说似乎非常笨重,但它是目前Azure的方式。

相关问题