Хранение массива объектов словаря в объекте application () - классический ASP - PullRequest
1 голос
/ 19 февраля 2012

Используя классический ASP, кто-нибудь знает, возможно ли (или желательно) поместить массив объектов словаря в объект приложения? Я пытался, но после примерно 50 000 или около того попаданий в сценарий под пулом приложений происходит повреждение или что-то подобное, и при запуске этой строки генерируются "trappable" ошибки C0000005: dictLanguage = Application ("lang")

Работает нормально в течение нескольких дней. Это как-то связано с тем, как я назначил объект приложения другой переменной, я думал, что он передаст указатель, а не копию? Кто-нибудь умнее меня знает, что здесь происходит?

if isempty(Application("lang")) then 
    ''# called when first visitor hits the page (following server reboot or app pool recycle)
    init()
    dictLanguage=Application("lang")
else
    ''# called for all other page hits
    dictLanguage=Application("lang") ''# ***** TRAPPABLE ERROR after a few thousand page views *******
end if


''# // fill the application object with an array containing 10 dictionary objects, each holding a different language.
''# // This function appears to run just fine.

function init

    Set initcn = Server.CreateObject("ADODB.Connection")
    initcn.Open dbConStr
    strSQL = "SELECT languageNo,quickRef,text FROM tblTranslation"
    Set rs = initcn.Execute(strSQL) 

    dim d(10)   

    Set d(1)=Server.CreateObject("Scripting.Dictionary")
    Set d(2)=Server.CreateObject("Scripting.Dictionary")
    Set d(3)=Server.CreateObject("Scripting.Dictionary")
    Set d(4)=Server.CreateObject("Scripting.Dictionary")
    Set d(5)=Server.CreateObject("Scripting.Dictionary")
    Set d(6)=Server.CreateObject("Scripting.Dictionary")
    Set d(7)=Server.CreateObject("Scripting.Dictionary")
    Set d(8)=Server.CreateObject("Scripting.Dictionary")
    Set d(9)=Server.CreateObject("Scripting.Dictionary")
    Set d(10)=Server.CreateObject("Scripting.Dictionary")

    while not rs.eof
        a=rs("languageNo")
        b=rs("quickRef")
        c=rs("text")
        ''# on error resume next
        d(a).Add b,c    
        rs.movenext
    wend

    initcn.close

    ''# Storing the array in the Application object
    Application.Lock
    Application("lang") = d
    Application.Unlock

end function

Ответы [ 2 ]

3 голосов
/ 19 февраля 2012

Один объект, который легко доступен и поддерживает сохранение в объекте приложения, имеет ProgID "MSXML2.FreeThreadedDOMDocument.3.0"

Это довольно хорошее решение для загрузки довольно статичных данных в масштабе приложения, если вы используете SQL Server, тогда функция SQL Server FOR XML позволяет довольно просто создать некоторый XML для загрузки в DOM.

2 голосов
/ 19 февраля 2012

Вы не должны использовать объекты Dictionary в качестве переменных уровня приложения из-за их потоковой модели. Если вам нужно использовать объект, подобный словарю, на уровне приложения, используйте бесплатный компонент Lookup от Microsoft (или бесплатный компонент Dictionary от Caprock Consulting).

Чтобы узнать больше, посетите этот URL.

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