Toon posts:

[asp/jscript] ADO pooling probleem?

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik maak gebruik van onderstaande functionaliteit (maar dan in pseudo code neergezet om het wat overzichtelijk te maken). Ik haal een menustructuur hier mee op. Ik kan aangeven bij een menuitem dat hij een andere tree erbij moet matchen. Detecteer ik dus zo'n menuitem, dan roep ik function A opnieuw aan.

ASP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
<%

function A (rootmenu)
{
    var query = "";
    
    query += "SELECT ";
    query += "  menuitem.resourceguid, ";
    query += "  menuitem.id, ";
    query += "  menuitem.title, ";
    query += "  menuitem.url, ";
    query += "  parent.parentid, ";
    query += "  child.childid, ";
    query += "  child.volgnr ";
    query += "FROM ";
    query += "  NavMenus AS menuitem ";
    query += "FULL JOIN ";
    query += "  NavRelaties AS child ";
    query += "  ON ";
    query += "  menuitem.id = child.parentid ";
    query += "FULL JOIN ";
    query += "  NavRelaties AS parent ";
    query += "  ON ";
    query += "  menuitem.id = parent.childid ";
    query += "WHERE NOT ";
    query += "  (parent.parentid IS NULL) ";
    query += "OR ";
    query += "  (menuitem.id = " + GetTopMenuId(rootmenu) + ") ";
    query += "ORDER BY ";
    query += "  menuitem.id ASC, ";
    query += "  child.volgnr ASC ";
    
    var rs = Server.CreateObject("ADODB.Recordset");
    rs.ActiveConnection = Application("conn");
    rs.CursorType = 3;
    rs.Open(query);
    
    while (!rs.EOF)
    {
        if (voorwaarde == true)
        {   
            query = "query...";
            
            var rsrootmenu = Server.CreateObject("ADODB.Recordset");
            rsrootmenu.ActiveConnection = Application("conn");
            rsrootmenu.CursorType = 3;
            rsrootmenu.Open(query);
            
            var rootm = rsrootmenu("rootmenu").value;
            
            rsrootmenu.Close();
            
            function A (rootm);
        }
        else
        {
            // gewone afhandeling
        }
        rs.MoveNext();
    }
    
    rs.Close();
}

function GetTopMenuId (rootmenu)
{
    var query = "SELECT id FROM NavMenus WHERE title = '" + rootmenu + "'";
    
    var rs = Server.CreateObject("ADODB.Recordset");
    rs.ActiveConnection = Application("conn");
    rs.CursorType = 3;
    rs.Open(query);
    
    var val = (!rs.EOF) ? rs("id").value : null;
    
    rs.Close();
    
    return val;
}

%>


En dan komen de problemen wanneer de functie voor een tweede keer wordt aangeroepen...

code:
1
2
3
4
5
Provider error '8000ffff' 

Catastrophic failure 

/cms/includes/menubuilder.asp, line 70


Het schijnt te maken te hebben met de meerdere connections naar sql server 2000, ik kan alleen geen passende oplossing vinden! Of maak ik zelf een grote fout die ik over het hoofd zie...

Ook handleiding e.d. over hoe je in zulke situaties het beste om kan gaan met het gebruik van meerdere connections binnen een recursieve functie kan ik ook niet vinden...

  • whoami
  • Registratie: December 2000
  • Laatst online: 11:43
Wat gebeurd er als je geen gebruik maakt van connection pooling ?

https://fgheysels.github.io/


Verwijderd

Topicstarter
Als ik eenmaal de functie draait doetie het perfect (als je dat bedoelt met: geen gebruik maken van connection pooling).

  • whoami
  • Registratie: December 2000
  • Laatst online: 11:43
Zet eens connection pooling uit; je kan dit doen door het in je connection string aan te geven.

https://fgheysels.github.io/


Verwijderd

Ten eerste: het is een VERSCHRIKKELIJK SLECHT IDEE (sorry voor de caps, maar die zijn hier wel van toepassing) om objecten via Session of Application objecten door te geven, en dat geldt dubbel voor ADO objecten.

Ten tweede: het is geen goed idee om een connectie langer open te houden dan dat nodig is. Connection pooling moet je niet zelf gaan coderen maar aan de driver en het OS over laten. Dus open de connectie altijd met dezelfde credentials, en dan zal er niet werkelijk een nieuwe connectie gebruikt worden, maar zal de connectie uit de pool van het OS herbruikt worden.