C#ASP.Net:长数据库操作期间出现异常(仅在某些情况下)
本文关键字:异常 情况下 Net 数据库 操作 C#ASP | 更新日期: 2023-09-27 17:59:23
我们有一个ASP.Net web应用程序,它使用WCF连接到其业务层。有时,当它执行一个巨大的操作时,我会感到异常。有趣的是,当我第一次运行它时,它是成功的。之后它抛出异常。
异常:套接字连接已中止。
操作是将邮政编码从csv文件上传到数据库表中。首先,我们从csv文件中读取并制作一个单独的长的邮政编码字符串。这将传递给存储过程,并执行数据库操作。
注意1:)当我放置断点并进行测试时,很明显,字符串的创建(在从csv中获取数据并附加之后)非常快(不到一分钟)。
注意2:)我删除了事务(从C#代码中)并进行了测试,即使在那时也存在异常。
注3:)csv中有10万(十万)条记录。每行有四列(ZipCode、市、县、州)。csv文件的大小为3MB。
我对事务日志的大小有疑问。然后,我使用以下命令收缩了日志文件。DBCC收缩文件('MyDB_log',1)GO
然后,我使用SELECT[size]、Max_size、Data_Space_Id、[File_Id]、Type_Desc、[Name]FROM FRAMIS_R2075.sys.database_files WHERE Data_Space_Id=0 检查日志大小
尺寸为128;最大尺寸为268435456;Type_Desc="LOG"
即使在缩小规模之后,例外情况仍然存在。
框架:.Net 3.0
DB:SQL Server 2005
嗯,当我又等了20分钟的时候,业务层似乎也有漏洞。上面写着,"调用阅读器时调用Read的尝试无效"。看到这一点,我删除了DbDataReader,并使用SqlCommand更新数据库表。同样,在业务层中出现了一个异常,大约20分钟后出现了"超时异常"。知道为什么会发生这种事吗?
private void ProcessDatabaseOperationsForZipCode(StringBuilder dataStringToProcess, int UserID)
{
int CountOfUnchangedZipCode = 0;
string strRetiredZipCode = "";
string strNewZipCode = "";
dataStringToProcess.Remove(dataStringToProcess.Length - 1, 1);
if (dataStringToProcess.Length > 0)
{
//TimeSpan.FromMinutes(0) - to make transaction scope as infinite.
using (TransactionScope transaction = TransactionScopeFactory.GetTransactionScope(TimeSpan.FromMinutes(0)))
{
SqlConnection mySqlConnection = new SqlConnection("data source=myServer;initial catalog=myDB; Integrated Security=SSPI;");
SqlCommand mySqlCommand = new SqlCommand("aspInsertUSAZipCode", mySqlConnection);
mySqlCommand.CommandType = CommandType.StoredProcedure;
mySqlCommand.Parameters.Add("@DataRows",dataStringToProcess.ToString());
mySqlCommand.Parameters.Add("@currDate", DateTime.Now);
mySqlCommand.Parameters.Add("@userID", UserID);
mySqlCommand.Parameters.Add("@CountOfUnchangedZipCode", 1000);
mySqlCommand.CommandTimeout = 0;
mySqlConnection.Open();
int numberOfRows = mySqlCommand.ExecuteNonQuery();
//Database db = DatabaseFactory.CreateDatabase();
//DbCommand cmd = db.GetStoredProcCommand("aspInsertUSAZipCode");
//cmd.CommandTimeout = 0;
//db.AddInParameter(cmd, "@DataRows", DbType.String, dataStringToProcess.ToString());
//db.AddInParameter(cmd, "currDate", DbType.DateTime, DateTime.Now);
//db.AddInParameter(cmd, "userID", DbType.Int32, UserID);
//db.AddOutParameter(cmd, "CountOfUnchangedZipCode", DbType.String, 1000);
//using (DbDataReader rdrUpgradeTypes = (DbDataReader)db.ExecuteReader(cmd))
//{
// //while (rdrUpgradeTypes.Read())
// //{
// // if (!String.IsNullOrEmpty(Utility.GetString(rdrUpgradeTypes, "NewZipCode")))
// // {
// // strNewZipCode = strNewZipCode + "," + Utility.GetString(rdrUpgradeTypes, "NewZipCode");
// // }
// //}
//}
transaction.Complete();
}
}
}
问题可能是与SQL Server的连接超时-连接和命令的默认超时时间都是30秒。
您可以增加超时(在连接字符串和代码中),也可以将更新分成块。
感谢Oded耐心回答我的问题。当我将庞大的数据库操作拆分为小批量时(在配置MSDTC之后),我的问题得到了解决。
在大型数据库操作期间,可能会出现内存不足错误。但是,如果此错误在事务中,则可能不可见。
1) 删除事务并查看"内存不足"异常是否可用。
2) 将大型数据库操作分解为小批量,以删除"内存不足"异常
3) 在应用层和数据库中配置MSDTC
4) 确保WCF不会突然超时。基于数据库操作,它应该有足够的时间。
5) 观察数据库服务器重新启动时的行为(这是最后一个选项)
中提供的一些有用信息
资源池中的系统内存不足';默认';要运行此查询
交易期间MSDTC异常:C#
C#ASP.Net:长数据库操作期间出现异常(仅限某些时间)
SQL Server 2005错误701-内存不足
其他一些检查:
1) 运行数据库引擎的windows帐户是否具有"在内存中锁定页面权限"?
2) Chek SQL Sever service pack版本。
3) 检查虚拟内存分页文件的大小
4) 检查最大服务器内存
5) 确定MemToLeave设置
6) "SQL Server内存配置和MemToLeave"