ADO异步查询超时

时间:2014-03-11 11:49:29

标签: c# sql sql-server asynchronous

我在使用log4net日志记录的Windows服务中使用SQL的异步ADO功能。 (BeginExecuteNonQuery回调到EndExecuteNonQuery)。

我首先尝试了我的测试存储过程(等待延迟5分钟)没问题。 我第二次尝试我的实际存储过程(基本选择和插入,但有时我必须处理大约10000行所以它需要超过30秒。)并且我有异步的超时问题。

    sqlConnection = new SqlConnection("Server=.;Database=Main;User ID=login;Password=12345.;Asynchronous Processing=true;");

    var command = new SqlCommand();
    command.Connection = sqlConnection;
    command.CommandTimeout = 0;
    command.CommandText = "RefreshRows";
    command.CommandType = System.Data.CommandType.StoredProcedure;

    command.Connection.Open();
    AsyncCallback callback = new AsyncCallback(HandleCallback);
    command.BeginExecuteNonQuery(callback, command);

我在回调方法中得到了这些;

    SqlCommand command = (SqlCommand)result.AsyncState;
    int rowCount = command.EndExecuteNonQuery(result);
    sqlConnection.Close();

编辑:异常是标准的sql超时异常;

System.Data.SqlClient.SqlException: Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.

我哪里做错了?任何帮助都会很棒,谢谢!

2 个答案:

答案 0 :(得分:0)

我刚刚卸载并重新安装了Windows服务,从现在开始一切运行良好。一旦我再次收到错误,我会立即更新,很奇怪:)

答案 1 :(得分:0)

问题可能是在打开连接会话之前。

您打开太多连接并将它们关闭太慢。您的会话数量增加以及.Net框架连接池何时变满,您的应用程序偶尔会开始返回Timeout expired例外。

我的建议是使用using声明。因此,当发生致命错误(例如故障转移(msdn)时,池会自动清除。

using (SqlConnection sc = new SqlConnection(connString))
   {
      SqlCommand sCmd = new SqlCommand("select some from tbl", sc);
      sc.Open();
      SqlDataReader sdr = sCmd.ExecuteReader();
      sdr.Close();
   }