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 \”     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...