C#ASP.Net:在长数据库操作期间出现exception(仅限某些时间)
我们有一个ASP.Net Web应用程序,它使用WCF连接到其业务层。 有时候,我在进行大规模操作时会遇到exception。 有趣的是,当我第一次运行它成功的时候。 之后它会抛出exception。
例外:套接字连接已中止。
操作是它将zipcodes从csv文件上载到数据库表中。 首先,我们从csv文件中读取并创建一个冗长的zipcodes字符串。 这将传递给存储过程并执行数据库操作。
注1 :)当我放置断点并进行测试时,很明显字符串的创建(在从csv获取数据并附加之后)非常快(不到一分钟)。
注2 :)我删除了事务(来自C#代码)并进行了测试,即使那时exception就在那里。
注3 🙂 csv中有一万卢比(十万)记录。 每行有四列(ZipCode,City,County,State)。 csv文件的大小是3MB。
我对事务日志大小有疑问。 然后我使用以下命令收缩日志文件。 DBCC SHRINKFILE(’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”
即使在缩小之后,exception仍在继续。
框架:.Net 3.0
DB:SQL Server 2005
好吧,当我等待20多分钟时,业务层似乎也有一个消息。 它说,“在调用阅读器时调用Read的无效尝试”。 通过这看,我删除了DbDataReader并使用SqlCommand来更新数据库表。 再次,在业务层出现exception,大约20分钟后说“超时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", 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之后)时,我的问题得到了解决。
在大型数据库操作期间,可能会出现内存不足错误 但是如果它在Transaction中,则可能看不到此错误。
1)删除事务并查看“内存不足”例外是否可用。
2)将大型数据库操作细分为小批量,以消除“内存不足”exception
3)在应用层和数据库中配置MSDTC
4)确保WCF不会突然超时。 它应该有足够的时间基于数据库操作。
5)观察重启数据库服务器时的行为(这是最后一个选项)
一些有用的信息
资源池“default”中没有足够的系统内存来运行此查询
交易期间的MSDTCexception:C#
C#ASP.Net:在长数据库操作期间出现exception(仅限某些时间)
SQL Server 2005错误701 – 内存不足
其他一些检查:
1)运行数据库引擎的Windows帐户是否具有“锁定页面内存权限”?
2)Chek SQL Sever服务包版本。
3)检查虚拟内存分页文件的大小
4)检查最大服务器内存
5)确定MemToLeave设置
6)“SQL Server内存配置和MemToLeave”