SQL Azure-暂时性”;ExecuteReader需要打开的连接;例外

SQL Azure-暂时性”;ExecuteReader需要打开的连接;例外,sql,azure,ado.net,Sql,Azure,Ado.net,我在作为云服务运行的Windows Azure应用程序中使用SQL Azure。大多数情况下,我的数据库操作都可以完全正常工作(也就是说,在处理了各种各样的超时和其他问题之后),但是我遇到了一个似乎 using (var connection = new SqlConnection(m_connectionString)) { m_ConnectionRetryPolicy.ExecuteAction(() => connection

我在作为云服务运行的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
我已经考虑过的事情

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

还有其他人经历过吗?我当然可以把它添加到异常列表中,这样会产生一次重试,但我不太习惯这样做,因为在try-and-catch,finally-block中写入所有内容

详情如下:

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 block中也要关闭连接。

MS专门为SQL Azure生成了一个企业库,下面是他们的模式和实践中的一些示例

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


几天前(西欧),我在生产部署中遇到了一系列这样的错误,但这些错误都自行消失了。同时,我看到SQLAzure出现超时、节流和其他错误。我假设平台(或者至少是我正在运行的服务器)存在临时问题


您的代码可能没有做错任何事情,但在SQL Azure上的性能下降。尝试并处理错误、执行重试、指数后退、队列(以降低并发性)、跨数据库分配负载——诸如此类的事情

您确定是读卡器出了故障,而不是打开了连接吗?在
m\u ConnectionRetryPolicy.ExecuteAction()
中包装
连接.Open()
时遇到异常

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

我还使用了
command.ExecuteReaderWithRetry(m_ConnectionRetryPolicy)
,这对我很有用


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

我相信这意味着Azure已经在幕后关闭了连接,而没有告诉连接池程序。这是故意的。因此,连接池会提供它认为可用的、打开的连接,但是当您尝试使用它时,它会发现它根本没有打开


这对我来说似乎很笨重,但这就是Azure目前的状况。

一定是缺少了什么-您不需要调用
connection.Open()
??
SqlConnection
已创建,但从未打开
ExecuteReader
不会那样工作。connection.Open就在第三行-它只是包含在对Microsofts topaz库的调用中,以处理暂时性错误:)应该更清楚地说明这一点,但是“commandRetryPolicy”和“connectionRetryPolicy”代码中的执行就是我正在使用的topaz库。很抱歉没有说得更清楚!using块实际上是try/finally的语法糖,在finally中有一个“dispose”,我非常确定对SqlConnection对象的dispose调用将导致关闭。啊,我也越来越期待这只是更暂时的错误。我想我必须考虑扩展topaz,以便它也能处理这些例外情况。现在,当我知道我不是唯一一个经历这种情况的人时,我会更加自信地去做这件事!:)