使用服务代理

时间:2017-06-26 19:37:30

标签: c# sql-server sqlconnection service-broker

我正在测试服务代理外部激活器和基于轮询的客户端,代表每个的处理速度性能。

对于外部激活器,我构建了一个命令行应用程序,当某个表发生任何更改并写入同一个数据库时,该应用程序会收到通知。 exe里面的代码如下所示

 private static void ProcessRequest()
    {
        using (var connection = new SqlConnection(ServiceConstant.ConnectionString))
        {
            connection.Open();
            do
            {
                using (var tran = connection.BeginTransaction())
                {
                    //Get a message from the queue
                    byte[] message = QueueProcessorUtil.GetMessage(ServiceConstant.QueueName, connection, tran, ServiceConstant.WaitforTimeout);
                    if (message != null)
                    {
                        MessageReceiving = true;
                        try
                        {
                            //Write it to the db
                            ProcessMessage(message);
                        }
                        catch (Exception ex)
                        {
                            logger.Write("Fail: " + ex);
                        }
                        tran.Commit();

                    }
                    else
                    {
                        tran.Commit();
                        MessageReceiving = false;
                    }
                }
            }
            while (MessageReceiving);
        }
    }

当我向队列插入20条消息时,所有消息的总插入时间约为 10ms

enter image description here

当我提取上面的ProcessMessage函数时,它将消息写入db到另一个单独的控制台应用程序,然后按如下方式调用此函数20次,这次大约需要 50ms

class Program
    {
        static void Main(string[] args)
        {
            for (var i = 1; i <= 20; i++)
            {
                string message = "mm";
                ProcessMessaage(message);
            }
        }
    }

enter image description here

ProcessMessage功能

string sql = @"INSERT INTO [Workflow].[dbo].[TestOrderLog]([OrderId],[RecordTime]) 
                        VALUES (@orderId, GETDATE()) SELECT SCOPE_IDENTITY()";

                using (SqlConnection con = new SqlConnection(ConfigurationManager.AppSettings["SqlConnection"].ToString()))
                using (SqlCommand com = new SqlCommand(sql, con))
                {
                    con.Open();
                    com.CommandType = CommandType.Text;
                    com.Parameters.AddWithValue("@orderId", 1);
                    try
                    {
                        var result = com.ExecuteScalar();
                        var id = (result != null) ? Convert.ToInt32(result) : 0;
                    }
                    catch (Exception ex)
                    {
                        throw ex;
                    }
                    con.Close();
                }

虽然在外部激活器代码循环中有昂贵的处理块(查询消息),但我不明白并且感到惊讶,在控制台应用程序代码中编写db比纯循环要快。

为什么在循环中纯插入比在外部激活器exe实例的代码中插入要慢?

在EAService.config文件中,

旁注<Concurrency min="1" max="1" />

1 个答案:

答案 0 :(得分:1)

这是我的一个荒谬的错误,第一个是编译和部署运行代码 第二个是在visual studio中使用调试器运行,因此间隔在没有调试器的情况下正常运行。