我在作为云服务运行的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.ExecuteReaderExecuteReader requires an open and available Connection. The connection's current state is closed
我已经考虑过的事情
还有其他人经历过这个吗?我当然可以将它添加到异常列表中,这将导致重试,但我对此不太满意
答案 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的方式。