我们正在使用 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 进行实际邮件发送,这似乎是一个产生返回代码的阻塞调用。
因此,据我所知,并没有真正尝试使用多线程来同时发送大量消息。它只进行异步排队,因此您的应用程序不必等待消息发送后再继续。