2008-11-26 54 views
0

我在页面上有一个循环来更新需要15-20秒才能完成的访问数据库。我最多只能每月运行一次,但我注意到每次运行它时,网站(IIS 6)都会停止提供页面。asp循环在运行时挂起网站

循环结束后,页面再次开始打开。

这里是我的代码:

For each Email in Emails 
    if Trim(Email) <> "" then 
     ' execute the update 
     Set MM_editCmd = Server.CreateObject("ADODB.Command") 
     MM_editCmd.ActiveConnection = MM_Customers_STRING 
     MM_editCmd.CommandText = "UPDATE Customers SET MailingListUpdates=False WHERE Email='" & Trim(Email) & "'" 
     MM_editCmd.Execute 
     MM_editCmd.ActiveConnection.Close 
     Response.Write "Email address " & Email & " successfully removed from the mailing list.<br>" 
    end if 
Next 

有什么我可以做,以避免这种情况?

上次更新的电子邮件大约有700条记录。

回答

2

您可能正在使用连接池中的所有可用连接。试试这个:

Set MM_editCmd = Server.CreateObject("ADODB.Command") 
MM_editCmd.ActiveConnection = MM_Customers_STRING 
For each Email in Emails 
    if Trim(Email) <> "" then 
     ' execute the update 
     MM_editCmd.CommandText = "UPDATE Customers SET MailingListUpdates=False WHERE Email='" & Trim(Email) & "'" 
     MM_editCmd.Execute 
     Response.Write "Email address " & Email & " successfully removed from the mailing list.<br>" 
    end if 
Next 
MM_editCmd.ActiveConnection.Close 

另外,作为一个较长期的东西尝试升级到SQL Server Express

+0

确实,问题在于打开和关闭每次迭代的连接。感谢您的示例代码。 – smartins 2008-11-26 14:48:35

0

“电子邮件”集合的来源是什么?如果它来自数据库,那么通过将它放在那里并加入它而不是以编程方式检索和迭代,可以获得更好的性能。另一个改进是只在必要时执行更新 - 即MailingListUpdates属性不是假的。

+0

如果电子邮件地址是:Emails = Split(Request.Form(“EmailAddresses”),vbCrLF) – smartins 2008-11-26 14:40:27

1

我建议采取创建/删除命令,并设置出循环和使用绑定变量(通过参数集合)。

2

MM_祸根ASP编程。创建命令对象并在每次迭代中打开和关闭连接都无法提高性能。连接字符串以每次创建一个新的命令字符串都不利于安全。

试试这个: -

Dim con : Set con = Server.CreateObject("ADODB.Connection") 
Dim cmd : Set cmd = Server.CreateObject("ADODB.Command") 
con.Open MM_Customers_STRING 
Set cmd.ActiveConnection = con 
cmd.CommandType = 1 // adCmdText (note SO not good at detecting VB comment) 
cmd.CommandText = "UPDATE Customers SET MailingListUpdates=False WHERE Email=?" 
Dim param : Set param = cmd.CreateParameter("email", 200, 1, 50) // adVarChar, adParamInput, size: 50 
cmd.Parameters.Append param 
Dim Email 
For Each Email in Emails 
    Email = Trim(Email) 
    If Email <> "" Then 
     param.value = Email 
     cmd.Execute 
    End If 
Next 
con.Close 

在电子邮件字段的索引将是很好。

+0

的确,问题在于每次迭代都会打开和关闭连接。感谢您的示例代码。 – smartins 2008-11-26 14:49:06