无可奈何之好再去国外的找。这回终于找到正解了。
错误:偶然才发生的错误,大概过了半个小时才会出现的。
错误的原因,大概在于,sql连接池的数据连接由于某些原因变成了bad connection.
so, 引用了这个错误的实际上已经失效了的连接去执行操作的时候产生一个异常,如果
我再次去执行那个操作,那么连接池就会去除这个连接,并且重新打开,然后第二次的执行就可以了。 就是说,如果网页出现错误然后我再刷新这个页面,就可以了。那么一般都是这个原因。
而且,在我的程序中,我都是用完了连接就立马关闭的,所以我想应该不会是连接数过多。
所以,参照了国外一个人写的按照限定次数重新尝试执行查询。
明后天在观察一下,如果没什么问题,那么就放心了。
具体的代码:
/// <summary>
/// 允许重新尝试的数据适配器获取数据
/// </summary>
/// <param name="sqlDataAdapter">数据适配器</param>
/// <param name="dataSet">数据集</param>
/// <param name="tableName">表名</param>
public static void FillDataSetAllowRetry(SqlDataAdapter sqlDataAdapter, DataSet dataSet, string tableName)
{
int retryCount = 0;
while (true)
{
try
{
sqlDataAdapter.Fill(dataSet, tableName);
break;
}
catch (SqlException ex)
{
sqlDataAdapter.SelectCommand.Connection.Close();
sqlDataAdapter.SelectCommand.Connection.Open();
retryCount++;
if (retryCount >= RetryLimit)
{
ApplicationLog.WriteError("FillDataSetAllowRetry exceed the limit times!" + ex.Message);
throw ex;
}
}
finally
{
sqlDataAdapter.SelectCommand.Connection.Close();
}
}
}
/// 允许重新尝试的数据适配器获取数据
/// </summary>
/// <param name="sqlDataAdapter">数据适配器</param>
/// <param name="dataSet">数据集</param>
/// <param name="tableName">表名</param>
public static void FillDataSetAllowRetry(SqlDataAdapter sqlDataAdapter, DataSet dataSet, string tableName)
{
int retryCount = 0;
while (true)
{
try
{
sqlDataAdapter.Fill(dataSet, tableName);
break;
}
catch (SqlException ex)
{
sqlDataAdapter.SelectCommand.Connection.Close();
sqlDataAdapter.SelectCommand.Connection.Open();
retryCount++;
if (retryCount >= RetryLimit)
{
ApplicationLog.WriteError("FillDataSetAllowRetry exceed the limit times!" + ex.Message);
throw ex;
}
}
finally
{
sqlDataAdapter.SelectCommand.Connection.Close();
}
}
}
我现在的情况: 网站和数据库不在同一个物理服务器上。
-------------------------------------------------
跟踪了一天,终于问题不再。解决的两个方式:一方面,网管把防火墙作了一些设置,不再针对这个ip定时关闭无响应的连接。另一方面,程序增加错误后重复执行的功能了--变相的允许出错多少次。
呵呵,现在终于感觉稳定多了。心也安了。
--------------------------------
555555555................ 还是有问题,郁闷
不过,现在通过设置config的 defaultredirect设置了一个errorpage.aspx
然后那个页面重新刷新跳到首页。应该问题不会再有了。
-------------------------------
plus,
现在发现一部分的原因是主机的连接池的销毁不够及时
比如,我把网站的dll重新上传了。网站主机由于挂的虚拟主机太多,不能及时地编译新的
dll.所以必须等待10-20分钟,重新访问才能恢复正常。这也是挺郁闷的问题的。
----------------------------------
plus
删除bin里面的dll,然后重新上传,就可以立即编译了。
可能是虚拟主机响应比较慢的时候。