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”