У нас есть код COM +, написанный на всех любимых языках (?) - VB6. Этот компонент COM + вызывает стандартный COM-компонент, написанный третьей стороной, которая выполняет вызовы в базу данных SQL Server. Мы ничего не делаем в COM + - ничего более (это только пример; мы не вызываем наши функции doStuff :-)):
Function doStuff
Dim o As Library.Object
Set o = New Library.Object
str = o.DoSomething()
Set o = Nothing
doStuff = str
End Function
В качестве ужасно быстрого стресс-теста мы обернули вызов в просто-напросто простой VBScript, который просто создает объект, вызывает метод в цикле, ничего не устанавливает и повторяет это несколько раз. Затем мы запускаем четыре из них одновременно в командной строке.
Мы видим, как четыре окна COM + перестали работать, как будто они каким-то образом заблокировали друг друга. Исходя из поведения выходных данных, похоже, что разные окна совместно используют экземпляры объектов где-то по пути: например, скорость, с которой вывод появляется между окнами, синхронизируется между окнами ... так что два могут быстро расти на скорости в то время как два других выплевывают линию в секунду (и когда они выплевывают линию, они делают это одновременно).
Затем, в конечном счете, все четыре окна, кажется, перестают работать - в службах компонентов мы видим, что время вызова начинает расти (поэтому с нескольких миллисекунд на вызов оно увеличивается до 30, 40 секунд). Иногда dllhost.exe завершается ошибкой, и мы получаем диалоговое окно ошибки COM Surrogate (в этот момент окно восстанавливается, когда появляется новый dllhost).
В базе данных есть активность no , поэтому мы исключили, что на уровне базы данных что-то блокируется. Кажется, мы добились лучших результатов, установив для компонента COM значение «Транзакции: отключено», но зависания не исчезают. Вместо new
мы попытаемся создать COM-объект с CreateObject
, чтобы увидеть, что он делает (если что-нибудь). Объектам присваивается значение «Ничто» после завершения как в COM +, так и на уровне VBScript.
Стоит отметить, что если сторонняя библиотека вызывается напрямую из VBScript (в обход COM +), проблем не возникает. Таким образом, создается впечатление, что это как-то связано с тем, как COM + взаимодействует с COM-объектами, но кроме того, чтобы поиграть с другими настройками в свойствах объектов в службах компонентов, на самом деле не уверен, что еще происходит.
Есть какие-нибудь предложения относительно того, что происходит под капотом, чтобы вызвать это? Или настройки подправить?
Дополнительная информация
В ответе на вопросы в ответах:
Дальнейшая работа ...
Похоже, что это проблема синхронизации где-то глубоко в COM + или COM. В нашем тестовом скрипте, если мы добавим случайную задержку в 10-50 мс на каждую итерацию, проблема исчезнет. Если у нас фиксированная задержка, мы блокируем. Похоже, некоторые поиски в Google показывают, что это может быть проблемой для сильно загруженного COM + с STA, что описано здесь в блоге MS . Было бы неплохо вернуться к блоку Server 2000 или блоку Server 2003 SP1: это может быть следующее, что нужно увидеть ...