C#ASP.Net:Exceptionoccursduringlongdatabaseoperation(certaintimesonly)我们有一个ASP.Netweb应用程序,它使用WCF连接到它的业务层。偶尔,我在进行大规模操作时会遇到异常。有趣的是,当我第一次运行它时,它成功了。之后它抛出异常。异常:套接字连接被中止。该操作是将csv文件中的邮政编码上传到数据库表中。首先,我们从csv文件中读取并创建一长串邮政编码。这将传递给存储过程并执行数据库操作。注意1:)当我放置断点并对其进行测试时,很明显字符串的创建(从csv获取数据并附加后)非常快(不到一分钟)。注2:)我删除了事务(从C#代码中)并进行了测试,即便如此,异常仍然存在。注3?csv中有十万(十万)条记录。每行有四列(邮政编码、城市、县、州)。csv文件的大小为3MB。我对事务日志大小有疑问。然后我使用以下命令缩小日志文件。DBCCSHRINKFILE('MyDB_log',1)GO然后我使用SELECT[Size],Max_Size,Data_Space_Id,[File_Id],Type_Desc,[Name]FROMFRAMIS_R2075.sys.database_files检查日志大小WHEREdata_space_id=0sizeis128;最大尺寸268435456;Type_Desc="LOG"即使在缩小后异常仍然存在。框架:.Net3.0数据库:SQLServer2005好吧,当我等待20多分钟时,似乎也有来自业务层的消息。它说,“调用Reader时调用Read的尝试无效”。通过这个,我删除了DbDataReader并使用SqlCommand更新数据库表。又是业务层出现异常,大概20分钟后说“超时异常”。知道为什么会这样吗?privatevoidProcessDatabaseOperationsForZipCode(StringBuilderdataStringToProcess,intUserID){intCountOfUnchangedZipCode=0;字符串strRetiredZipCode="";字符串strNewZipCode="";dataStringToProcess.Remove(dataStringToProcess.Length-1,1);if(dataStringToProcess.Length>0){//TimeSpan.FromMinutes(0)-使事务范围无限大。使用(TransactionScopetransaction=TransactionScopeFactory.GetTransactionScope(TimeSpan.FromMinutes(0))){SqlConnectionmySqlConnection=newSqlConnection("datasource=myServer;initialcatalog=myDB;IntegratedSecurity=SSPI;");SqlCommandmySqlCommand=newSqlCommand("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();intnumberOfRows=mySqlCommand.ExecuteNonQuery();//数据库db=DatabaseFactory.CreateDatabase();//DbCommandcmd=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(DbDataReaderrdrUpgradeTypes=(DbDataReader)db.ExecuteReader(cmd))//{////while(rdrUpgradeTypes.Read())////{////if(!String.IsNullOrEmpty(Utility.GetString(rdrUpgradeTypes,"NewZipCode")))////{////strNewZipCode=strNewZipCode+","+Utility.GetString(rdrUpgradeTypes,"NewZipCode");////}////}//}transaction.Complete();}}}问题可能是与SQLServer的连接超时–连接和命令默认超时为30秒。您可以启动超时(在连接字符串和代码中)或将更新分成块。感谢Oded耐心地回答我的问题。当我将大型数据库操作拆分为小批量时(配置MSDTC之后),我的问题得到了解决。在大型数据库操作期间,可能会出现内存不足错误,但如果它在事务中,则可能看不到此错误。1)删除事务并查看“内存不足”异常是否有效。2)将大型数据库操作细分为小批量,以消除“内存不足”异常3)在应用层和数据库中配置MSDTC4)确保WCF不会突然超时。它应该有足够的时间基于数据库操作。5)重新启动数据库服务器时观察行为(这是最后一个选项)一些有用的信息“默认”资源池中没有足够的系统内存来运行此查询MSDTCexceptionduringtransaction:C#C#ASP.Net:Inlong数据库运行时出现异常(仅部分时间)SQLServer2005Error701-OutofMemory其他检查:1)运行数据库引擎的Windows账户是否有“LockPagesMemoryPermission”?2)查看SQLSever服务包版本。3)检查虚拟内存分页文件的大小4)检查最大服务器内存5)确定MemToLeave设置6)《SQLServer内存配置和MemToLeave》以上是C#学习教程:C#ASP.Net:Exceptionduringlong数据库操作(限时)所有内容分享,如果对你有用,需要了解更多C#学习教程,希望大家多多关注——本文收集自网络且不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
