0

我在作为云服务运行的 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

我已经考虑过的事情

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

有没有其他人经历过这个?我当然可以将其添加到会产生重试的异常列表中,但我对此不太满意

4

5 回答 5

0

把所有的东西都写在 try and 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 块中关闭连接。

于 2013-04-03T07:56:22.453 回答
0

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

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

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

于 2013-04-03T08:14:17.200 回答
0

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

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

于 2013-04-03T08:17:52.310 回答
0

您确定是阅读器失败而不是打开连接吗?当我connection.Open()m_ConnectionRetryPolicy.ExecuteAction().

但是,如果我跳过 ExecuteAction 包装器并使用connection.OpenWithRetry(m_ConnectionRetryPolicy).

而且我也在使用command.ExecuteReaderWithRetry(m_ConnectionRetryPolicy)哪个对我有用。

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

于 2013-07-12T19:34:17.647 回答
0

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

这对我来说似乎很笨拙,但这是 Azure 目前的方式。

于 2015-11-17T01:58:23.033 回答