首页 > 解决方案 > 如何同时执行 DataAdapter.Fill()

问题描述

我已经在 ASP.Net 应用程序上工作了很长时间,并且有超过 10 个客户端在使用该应用程序。但是现在我在应用程序中发现了一个问题,就是我有一个存储过程调用,大约需要30秒才能执行。这不是问题,因为 SQL 代码高度复杂且循环多次。问题是:每当执行存储过程调用时,我都无法使用任何其他函数或存储过程调用。当我尝试调试时,问题是“DataAdapter.Fill()”函数正在等待第一个存储过程调用完成。

我执行存储过程调用并返回数据的代码是:

public static DataSet ExecuteQuery_SP(string ProcedureName, object[,] ParamArray)
    {
        SqlDataAdapter DataAdapter = new SqlDataAdapter();       
        DataSet DS = new DataSet();
        try
        {
            if (CON.State != ConnectionState.Open)
                OpenConnection();
            SqlCommand cmd = new SqlCommand();
            cmd.CommandTimeout = 0;
            cmd.CommandText = ProcedureName;
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Connection = CON;
            cmd.Transaction = SqlTrans;
            string ParamName;
            object ParamValue;
            for (int i = 0; i < ParamArray.Length / 2; i++)
            {
                ParamName = ParamArray[i, 0].ToString();
                ParamValue = ParamArray[i, 1];
                cmd.Parameters.AddWithValue(ParamName, ParamValue);
            }
            DataAdapter = new SqlDataAdapter(cmd);
            DataAdapter.Fill(DS);
            cmd.CommandText = "";
        }
           catch (Exception ea)
        {
        }
        return DS;
    }

所有存储过程调用都通过这个函数工作。因此,当我的第一个存储过程调用“A”正在运行时,存储过程调用“B”在“A”完成之前不会执行。

这会降低应用程序的整体性能并导致数据检索出现问题。我浏览了谷歌,发现“线程”可能会有所帮助,但我无法正确执行线程。我对这类事情不是很熟悉。如果您可以纠正问题,这将很有帮助。我的第一个存储过程调用是:

 ds = DB.ExecuteQuery_SP("SelectOutstandingReportDetailed", parArray);

其中 ds 是 DataSet 对象。第二个存储过程调用是:

ds = DB.ExecuteQuery_SP("[SelectAccLedgersDetailsByID]", ParamArray);

我当前的数据库连接打开功能是:

 public static bool OpenConnection() 
        {
            try
            {

                    Server = (String)HttpContext.GetGlobalResourceObject("Resource", "Server");
                    DBName = (String)HttpContext.GetGlobalResourceObject("Resource", "DBName");
                    UserName = (String)HttpContext.GetGlobalResourceObject("Resource", "UserName");
                    PassWord = (String)HttpContext.GetGlobalResourceObject("Resource", "PassWord");

                    string ConnectionString;
                    ConnectionString = "server=" + Server + "; database=" + DBName + "; uid=" + UserName + "; pwd=" + PassWord + "; Pooling='true';Max Pool Size=100;MultipleActiveResultSets=true;Asynchronous Processing=true";

                    CON.ConnectionString = ConnectionString;
                    if (CON.State != ConnectionState.Open)
                    {
                        CON.Close();
                        CON.Open();
                    }

            }
            catch (Exception ea)
            {
            }
            return false;
        }

其中 'CON' 是一个公共 SqlConnection 变量

static SqlConnection CON = new SqlConnection();

我发现了问题,就是所有的存储过程调用都是通过这个'CON'对象来执行的。如果每个存储过程调用都有单独的 SqlConnection 对象,则没有问题。那么是否可以为每个 ExecuteQuery_SP 调用创建单独的 SqlConnection 。如果有任何疑问,请发表评论。谢谢

标签: c#asp.netmultithreadingstored-proceduresdataadapter

解决方案


默认情况下,SQL Server 将同时允许数千个连接。这不是您问题的根源。您已强制对存储过程的每次调用都通过一个方法进行汇集。排除您对存储过程的调用 - 换句话说,丢失 ExecuteQuery_SP 方法,这是一个瓶颈。然后再次测试。

这是对数据层的介绍。


推荐阅读