Search code examples
asp-classic

Storing an array of dictionary objects in an application() object - Classic ASP


Using Classic ASP, does anyone know if it is possible (or advisable) to put an array of dictionary objects into an Application Object? I tried but after about 50,000 or so hits to the script below the App Pool gets corrupted or something and "trappable" C0000005 errors get generated when this line is run: dictLanguage=Application("lang")

Works fine for a few days though. Is it something to do with the way I've assigned the application object to another variable, I thought it would pass a pointer not a copy? Anyone smarter than me know what's going on here?

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

Solution

  • You should not use Dictionary objects as application-level variables due to their threading model. If you need to use a Dictionary-like object in the application-level use the free Lookup Component from Microsoft (or a free Dictionary Component from Caprock Consulting).

    To learn more, please visit this url.