SQL Server 数据库邮件在发送邮件时是否使用线程?

SQL Server 数据库邮件在发送邮件时是否使用线程?

我们正在使用 SQL Server 2008数据库邮件向我们的网站访问者发送电子邮件。我不知道 SQL Server 是从队列中挑选邮件逐个发送邮件还是使用线程同时发送电子邮件。

如果数据库邮件使用线程,有没有办法增加并发运行的线程数?

答案1

摘自联机丛书:数据库邮件

为了将对 SQL Server 的影响降到最低,发送电子邮件的组件在 SQL Server 之外的单独进程中运行。即使外部进程停止或失败,SQL Server 仍将继续对电子邮件进行排队。一旦外部进程或 SMTP 服务器上线,排队的邮件就会被发送。

数据库邮件使用Service Broker技术:

数据库邮件提供后台或异步传递。当您调用 sp_send_dbmail 发送消息时,数据库邮件会将请求添加到 Service Broker 队列。存储过程立即返回。外部电子邮件组件接收请求并传递电子邮件。

实际的电子邮件传递由您的 SMTP 服务器处理,因此它将承担大部分工作量,并且应根据容量/电子邮件流量要求进行配置。

规划数据库邮件

答案2

我建议尝试发送大量邮件,看看效果如何。我不知道数据库邮件是串行发送还是并行发送的 - 但是,如果您需要保证邮件性能良好,我建议您从客户端应用程序发送邮件,而不是使用 SQL Server 中的数据库邮件,我怀疑后者的设计目的并非如此。

答案3

SQL Server 使用线程发送邮件,但您的邮件连接器可能不这样做。

答案4

据我所知,数据库邮件不会尝试多线程。但它确实使用 Service Broker,因此调用 sp_send_dbmail 将立即返回,而不会等待消息发送。

查看 msdb.sys.service_queues(Service Broker 的队列定义,这是数据库邮件的实现方式),我看到名为 InternalMailQueue 和 ExternalMailQueue 的队列,并且两个队列的 max_readers 都设置为 1。查看它们的激活过程(sp_ExternalMailQueueListener 和 sp_sysmail_activate),并没有发现在线程方面有什么特别之处。前者进行一些错误处理和对话清理,后者通过 master..xp_sysmail_activate 进行实际邮件发送,这似乎是一个产生返回代码的阻塞调用。

因此,据我所知,并没有真正尝试使用多线程来同时发送大量消息。它只进行异步排队,因此您的应用程序不必等待消息发送后再继续。

相关内容