2008-11-26 7 views
0

J'ai une boucle sur la page pour mettre à jour une base de données d'accès qui prend 15-20 secondes pour terminer. Je ne l'exécute qu'une fois par mois au maximum mais j'ai remarqué que chaque fois que je le lance, le site web (IIS 6) arrête simplement de servir les pages. Une fois la boucle terminée, les pages recommencent à s'ouvrir.La boucle d'ASP bloque le site Web pendant l'exécution

Voici mon code:

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 

Est-ce que je peux faire pour éviter cela?

Les courriels de la dernière mise à jour était d'environ 700 records.

Répondre

2

Vous utilisez probablement toutes les connexions disponibles dans le pool de connexions. Essayez ceci:

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 

également comme essayer chose à long terme mise à niveau vers SQL Server Express

+0

En effet, le problème était l'ouverture et la fermeture de la connexion à chaque itération. Merci pour le code d'exemple. – smartins

0

Quelle est la source de la collection "Emails"? Si elle provient de votre base de données, vous obtiendrez de meilleures performances en la laissant là et en la rejoignant plutôt qu'en la récupérant et l'itérant par programmation. Une amélioration supplémentaire consisterait à n'effectuer la mise à jour que si cela est nécessaire - c'est-à-dire que l'attribut MailingListUpdates n'est pas déjà faux.

+0

La source si les emails sont: Emails = Split (Request.Form ("EmailAddresses"), vbCrLF) – smartins

1

Je suggère de prendre une création/suppression de commande et d'installation hors de la boucle et d'utiliser des variables de liaison (via la collection de paramètres).

2

MM_ la bête noire de programmation ASP. Créez l'objet de commande et l'ouverture et la fermeture d'une connexion à chaque itération ne peuvent pas être bonnes pour les performances. Concaténer la chaîne pour créer une nouvelle chaîne de commande à chaque fois n'est pas bon pour la sécurité non plus.

Essayez ceci: -

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 

Un index sur le champ Email serait bien.

+0

En effet, le problème était l'ouverture et la fermeture de la connexion à chaque itération. Merci pour l'exemple de code. – smartins

Questions connexes