如何解决C#ASP.Net:长时间数据库操作期间发生异常仅几次
|| 我们有一个使用WCF连接到其业务层的ASP.Net Web应用程序。有时,当我执行大量操作时,我会感到异常。有趣的是,当我第一次运行它时,它是成功的。之后,它将引发异常。 例外:套接字连接已中止。 该操作是将邮政编码从csv文件上载到数据库表中。首先,我们从csv文件中读取并制作一个冗长的邮政编码字符串。这将传递到存储过程,并执行数据库操作。 注1 :)当我放置断点并进行测试时,很明显,字符串的创建(从csv中获取数据并追加后)非常快(不到一分钟)。 注意2 :)我删除了事务(从C#代码中)并进行了测试,即使那里有异常。 注3 :) csv中有10万(十万)条记录。每行有四列(邮政编码,城市,县,州)。 csv文件的大小为3MB。 我对事务日志的大小有疑问。然后,使用以下命令缩小日志文件。 DBCC SHRINKFILE(\'MyDB_log \',1)开始 然后,我使用SELECT [Size],Max_Size,Data_Space_Id,[File_Id],Type_Desc,[Name]从FRAMIS_R2075.sys.database_files检查了日志大小,其中data_space_id = 0 大小为128;最大大小为268435456; Type_Desc =“ LOG” 即使缩小之后,异常仍然会出现。 框架:.Net 3.0 资料库:sql Server 2005 好吧,当我再等20分钟时,似乎在业务层也有例外。它说:“调用阅读器时尝试调用Read无效。”看到这一点,我删除了DbDataReader,并使用sqlCommand更新数据库表。同样,大约20分钟后,“ Timeout exception”(超时异常)在业务层出现异常。知道为什么会这样吗? 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\",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 \”
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。