我正在测试服务代理外部激活器和基于轮询的客户端,代表每个的处理速度性能。
对于外部激活器,我构建了一个命令行应用程序,当某个表发生任何更改并写入同一个数据库时,该应用程序会收到通知。 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
当我提取上面的ProcessMessage
函数时,它将消息写入db到另一个单独的控制台应用程序,然后按如下方式调用此函数20次,这次大约需要 50ms
class Program
{
static void Main(string[] args)
{
for (var i = 1; i <= 20; i++)
{
string message = "mm";
ProcessMessaage(message);
}
}
}
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" />
答案 0 :(得分:1)
这是我的一个荒谬的错误,第一个是编译和部署运行代码 第二个是在visual studio中使用调试器运行,因此间隔在没有调试器的情况下正常运行。