我在使用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.
我哪里做错了?任何帮助都会很棒,谢谢!
答案 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();
}