Classic ASP : C0000005 Error on execution

Обратите внимание на то, что много ответов указывает, что Хеш-таблица синхронизируется. На практике это покупает Вас очень мало. синхронизация находится на средстве доступа / мутаторные методы остановят два добавления потоков или удаление из карты одновременно, но в реальном мире Вам часто будет нужна дополнительная синхронизация.

А очень общая идиома должна "проверить тогда помещенный" — т.е. искать запись в эти Map и добавить его, если это уже не существует. Это ни в коем случае не атомарная операция, используете ли Вы Hashtable или HashMap.

эквивалентно синхронизируемый HashMap может быть получен:

Collections.synchronizedMap(myMap);

, Но правильно реализовать эту логику Вам нужно дополнительная синхронизация из формы:

synchronized(myMap) {
    if (!myMap.containsKey("tomato"))
        myMap.put("tomato", "red");
}

Даже итерация по Hashtable записи (или HashMap полученный Collections.synchronizedMap) не ориентированы на многопотоковое исполнение, если Вы также не охраняете Map от того, чтобы быть измененным до дополнительной синхронизации.

Реализации ConcurrentMap интерфейс (например ConcurrentHashMap ) решают часть этого включением ориентированная на многопотоковое исполнение check-then-act семантика , такая как:

ConcurrentMap.putIfAbsent(key, value);

7
задан Community 23 May 2017 в 12:33
поделиться

1 ответ

Я добавляю этот ответ здесь, хотя я понимаю, что это намного позже чем тогда, когда на вопрос сначала ответили. Я помещаю ответ здесь в случае, если он сохраняет кого-либо еще стычка, я только что был через.

я также получал эту ошибку на своей ASP-странице после того, как я переустановил Windows 10. Ранее на моей localhost установке IIS, та же страница не сделала ошибки. Однако - теперь это сделало - со следующей ошибкой:

Активная ошибка Страниц Сервера 'ASP 0115' Неожиданная ошибка index.asp

А trappable ошибка (C0000005) произошла во внешнем объекте. Сценарий не может продолжить работать.

я попробовал много вещей попытаться отсортировать его, такие как:

  1. Windows 10 Переустановки снова
  2. Переустановка IIS на новой установке Windows 10
  3. Попытка всех видов комбинаций версий MySQL и Коннектора ODBC
  4. Проверка недостающие файлы в Windows Process Monitor согласно один из ответов на этой странице
  5. , Имеющей предосудительные отношения с Пулами приложений
  6. , Имение предосудительные отношения с большим количеством версий Распространяемых файлов Microsoft Visual C++

, которым Моя проблема была с SQL, Вставляет - когда это работало, я получил ошибку.

Это - сокращение вниз версия его:

sql = ""
sql = sql & " INSERT INTO my_table ( "
sql = sql & " card_sender,  "
sql = sql & " senders_email,  "
sql = sql & " recipients_email,  "
sql = sql & " card_body,  "
sql = sql & " session_id, "
sql = sql & " replyID) VALUES ( "
sql = sql & " ?,  "
sql = sql & " ?,  "
sql = sql & " ?,  "
sql = sql & " ?,  "
sql = sql & " ?,  "
sql = sql & " ?)  "

Set stmt = Server.CreateObject("ADODB.Command")
stmt.ActiveConnection = oConn
stmt.Prepared = true
stmt.commandtext = sql

stmt.Parameters.Append stmt.CreateParameter("@001_card_sender", adVarChar, adParamInput, 255, card_sender)
stmt.Parameters.Append stmt.CreateParameter("@002_senders_email", adVarChar, adParamInput, 255, senders_email)
stmt.Parameters.Append stmt.CreateParameter("@003_recipients_email", adVarChar, adParamInput, 255, recipients_email)
stmt.Parameters.Append stmt.CreateParameter("@004_card_body", adLongVarChar, adParamInput, 256665, card_body)
stmt.Parameters.Append stmt.CreateParameter("@sessionsessionID", adVarChar, adParamInput, 255, session.sessionID)
stmt.Parameters.Append stmt.CreateParameter("@replyID", adVarChar, adParamInput, 255, session("replyID"))

stmt.Execute
Set stmt = Nothing

Через процесс создания SQL и нахождения, какая строка инициировала ошибку, я нашел, что эта строка вызвала проблему:

stmt.Parameters.Append stmt.CreateParameter("@replyID", adVarChar, adParamInput, 255, session("replyID"))

В моем примере, эти session("replyID") значение не было установлено, и это инициировало ошибку.

, Когда я изменил код, чтобы проверить, была ли переменная сеанса установлена, она устранила проблему:

...
foo = session("replyID")
if foo = "" then foo = 1
...
stmt0003.Parameters.Append stmt0003.CreateParameter("@replyID", adVarChar, adParamInput, 255, foo)
[еще 1123] тестирование подтвердило, что ошибка произойдет для любой переменной, которая была пустой, таким образом, я должен был включить, если оператор для каждой переменной и установил его на что-то, если это было пустым, для предотвращения этих ошибок, которые я не сделал используемый для преуспевания в предыдущую установку Windows 10 на том же ПК.

После пребывания приблизительно в течение дня, работая над ним, он было облегчение добраться до сути относительно него.

0
ответ дан 7 December 2019 в 12:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: