asp loop зависает во время работы сайта - PullRequest
0 голосов
/ 26 ноября 2008

У меня есть цикл на странице для обновления базы данных доступа, который занимает 15-20 секунд. Я запускаю его не чаще одного раза в месяц, но заметил, что каждый раз, когда я запускаю его, веб-сайт (IIS 6) просто перестает обслуживать страницы.

После окончания цикла страницы снова открываются.

Вот мой код:

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 записей.

Ответы [ 4 ]

2 голосов
/ 26 ноября 2008

MM_ программирование ASP 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

Индекс в поле Email был бы хорош.

2 голосов
/ 26 ноября 2008

Возможно, вы используете все доступные соединения в пуле соединений. Попробуйте вместо этого:

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

1 голос
/ 26 ноября 2008

Я предлагаю вывести создание / удаление команды и настройки из цикла и использовать переменные связывания (через сбор параметров).

0 голосов
/ 26 ноября 2008

Что является источником для коллекции "Электронные письма"? Если это из вашей базы данных, вы получите гораздо лучшую производительность, оставив ее там и присоединившись к ней, а не извлекая и повторяя программно. Дополнительным улучшением будет выполнение обновления только в случае необходимости, т. Е. Атрибут MailingListUpdates уже не равен false.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...