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();
            }
        }

    }

C#ASP.Net:长数据库操作期间出现异常(仅在某些情况下)

问题可能是与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"