我们正在使用SQL Server 2008 数据库邮件发送电子邮件给我们的网站访问者。 我不知道SQL Server是通过从队列中拾取一个接一个地发送邮件,还是使用线程同时发送邮件。
如果数据库邮件使用线程,有什么办法可以增加并发运行的线程数?
采取从联机丛书: 数据库邮件
为了最大限度地减less对SQL Server的影响,传递电子邮件的组件在一个单独的进程中在SQL Server之外运行。 即使外部进程停止或失败,SQL Server仍将继续对电子邮件进行排队。 一旦外部进程或SMTP服务器联机,排队的消息将被发送。
数据库邮件使用Service Broker技术:
数据库邮件提供后台或asynchronous交付。 当您调用sp_send_dbmail发送消息时,数据库邮件将请求添加到Service Broker队列。 存储的过程立即返回。 外部电子邮件组件接收请求并发送电子邮件。
实际的电子邮件传送是由您的SMTP服务器处理的,所以这将首当其冲的工作量,应该根据容量/电子邮件stream量要求进行调配。
请参阅规划数据库邮件
我build议尝试大量的邮件,看看它的performance如何。 我不知道数据库邮件是以串行方式还是并行方式发送 – 但是如果您需要保证运行良好的邮件,我build议您从客户端应用程序发送邮件,而不是在SQL Server中使用数据库邮件,我怀疑为了这个目的而devise的。
SQL Server使用线程发送邮件,但您的邮件连接器可能不会。
尽我所知,数据库邮件不会做任何multithreading的尝试。 它确实使用Service Broker,所以调用sp_send_dbmail将立即返回,而不是等待消息被发送。
查看msdb.sys.service_queues(Service Broker的队列定义,这是Database Mail的实现方式),我看到名为InternalMailQueue和ExternalMailQueue的队列,并且都将max_readers设置为1.查看其激活过程(sp_ExternalMailQueueListener和sp_sysmail_activate)并不是说线程方面有什么奇特的东西。 前者进行一些error handling和对话清理,而后者通过master..xp_sysmail_activate发送实际的邮件,这似乎是一个阻塞调用,产生一个返回码。
所以就我所知,为了同时发送大量消息,没有multithreading的实际尝试。 它只做asynchronous排队,所以你的应用程序在继续之前不必等待消息被发送。