3

我正在使用 JOB 来持续观察表数据。在 JOB 内部,我调用 SQLCLR SP。SQLCLR SP 将运行。在 while 循环之前,我将打开 SQL 连接。在 for 循环中,我将仅在一个连接中访问数据库 1000-10000 次。在我的工作完成之前,我不会关闭数据库连接。

            SqlConnection connection = null;
            try
            {
                using (connection = new SqlConnection("context connection=true"))
                {
                    connection.Open();

                    DataTable dt;
                    SqlDataAdapter adp=new SqlDataAdapter("select * from tableName",CnStr);
                    DataSet ds=new DataSet();
                    adp.Fill(ds,"TableName");
                    dt= ds[0];

                    //dt.Rows.count may be range from 1000-10000

                    for(i=0;i<dt.Rows.count;i++)
                    {
                        int id = int.Parse(dt.Rows[i][0].ToString());

                        SqlCommand command = new SqlCommand("select * from table1 where IsParsed=0 and Id=" + id, connection);
                        SqlDataReader r1 = command.ExecuteReader();

                        SqlCommand command = new SqlCommand("Insert into table2 (values)", connection);
                        int r2 = command.ExecuteNonQuery();

                        //Always get table1 data which has IsParsed=0. Get those rows manipulate those rows data and 
                        // insert into datatable table2 and update those rows to IsParsed=1

                        SqlCommand command = new SqlCommand("Update table1 set IsParsed=1 where  id=@id", connection);
                        int r3 = command.ExecuteNonQuery();

                        // Run the Billing Logic here

                        // Insert into Billing Table 
                        SqlCommand command = new SqlCommand("Insert into Billing(values)", connection);
                        int r2 = command.ExecuteNonQuery();

                    }
                }
            }
            catch (Exception ex)
            {
            }
            finally
            {
                connection.close();
            }

这种方法有什么问题让我知道吗?使用这样的连接有什么问题吗?提供适当的建议..

我浏览了文章 更好的方法来在单个连接中执行多个命令

在这里,我使用上下文连接并在单个连接中执行数千个命令。上下文连接中有没有考虑连接池..?每个连接的单个命令执行与单个连接的多个命令执行的性能如何?

另外我想知道在上下文连接和常规连接等两种情况下都会产生相同的结果?因为 SP 部署在 DB 本身中。如果我错了,请纠正我。

4

2 回答 2

3

通过单个连接执行大量查询没有问题。您如何使用具有上下文连接的 SQL CLR 过程。正如 MSDN 中提到的,它指出:

使用上下文连接通常会带来更好的性能和更少的资源使用。上下文连接是仅进程内连接,因此它可以通过绕过网络协议和传输层“直接”联系服务器,以发送 Transact-SQL 语句并接收结果。身份验证过程也被绕过。

有关上下文和常规连接的更多信息,请参阅此链接

于 2013-03-16T09:21:26.930 回答
2

,可以通过单个连接执行大量查询。

如果您要打开/关闭一个连接来为这 1000 多行中的每一行运行这三个 SQL 查询,那么您的代码可能会执行得更差。

于 2013-03-16T05:31:08.580 回答