Har fått indikationer från Oraclegänget att man helst skall ha en kontinuerlig connection mot Oracle. Funkar inte Connection Poolingen bra eller? Har aldrig kört med Connection Pooling, får väl googla lite =) Om du absolut måste ha en global connection som är öppen hela tiden får du nog lägga den i en applikations variabel. OK, verkar som om det är den lindrigaste vägen att gå, att öppna den i Application_OnLoad Det jag ville få sagt är: Det där stämmer nog på något sätt; jag har nämligen råkat ut för att jag har haft en connection som jag öppnat, stängt, öppnat osv. på en och samma sida (har använt cache också:D ) men den har buggat ganska rejält. Kom efter ett tag på att anslutningen inte alltid stängdes, även om .Close kördes ;) Skumt (låter konstigt iaf, men den buggen i drivisen tyder iaf. på att poolningen verkade fungera eller något sådant) Nånting är buggat med poolningen Det är inte .NET som hanterar connection poolen. Det sker utanför .NET och du skall alltid gör .Close()/.Dispose() på dina connections. OK Om jag inte missminner mig så är connectionpoolen mot SQL Server på default. Där måste du aktivt välja att stänga av den. Kontinuerlig connection mot Oracle, var lägga den?
Grundförutsättningar:
Har en applikation som hämtar data från en Oracle var tionde sekund, detta data lagrar jag i ett Cache objekt som "dör" efter tio sekunder.
Vid varje uppdatering så gör jag "som man lärt":
Öppna connection och command så sent som möjligt, hämta data, stäng ditt command och connection.
Nu har jag lärt mig att det finns en "lyssnare" i Oracle som sköter alla påloggningar mot databasen, denna delegerar sedan anropet till en egen port, som sedan genomför min sqlfråga.
Om lyssnaren skulle "dö" kommer jag inte åt databasen nåt mer, men om jag öppnar min connection en gång och använder den, så kan lyssnaren "dö" men jag har min connection öppen, vilket skall minska risken att jag inte får data om lyssnaren dör.
Nu till frågan:
Var och hur skall jag i asp.net skapa denna koppling?
Kan den läggas i en Applicationsvariabel, eller kan man lägga den i nån global variabel som skapas när första sidan visas?
Sessions objektet ser jag inte som ett alternativ eftersom jag vill att alla skall nyttja samma connection
MVH/UffeSv: Kontinuerlig connection mot Oracle, var lägga den?
Testa att göra "som vanligt" och be Oraklen ;) kolla om det är acceptabelt.
/mickeSv: Kontinuerlig connection mot Oracle, var lägga den?
Om inte nån har några bra länkar för mig att kolla vidare på
[edit]
Det jag lyckats snoka reda på hitintills är att man lika "förjordat" skall köra close och dispose på den connection man har i poolen, så det verkar inte vara den lösningen jag är ute efter...
Det verkar inte som om man kör med connection öppen hela tiden som jag eftersöker.Sv: Kontinuerlig connection mot Oracle, var lägga den?
Skapa den i global.asax filen så är det säkert att den alltid hänger med så länge servern är igång...
Men vad är det för data du hela tiden hämtar?
Kan man inte ha någon typ av SP i Oracle som skriver ut till en fil när datat har ändrats?
Chache objektet stödjer ju att den uppdateras så fort som en fil uppdateras...
Mvh,
ThomasSv: Kontinuerlig connection mot Oracle, var lägga den?
Det är realtidstatistik som uppdateras i databasen var femte sekund, men för att lindra hitsen mot db kör vi var tionde sekund, eftersom det räcker för våran visning.
Vi har haft upp att dom skall skriva en fil till våran webserver, men dom vill inte lägga det arbetet också på den databasen/servern. Dom ansåg att det skulle bli mer kraft som skulle åtgå till att skyffla textfiler över nätet var 5/10 sekund, än om vi hämtar direkt var 10 sekund. Detta även för att vi skall skriva till två servrar, prodserver och backupserver.
Vi har en annan tjänst (hämtar data från en annan Oracle) som skriver ner till webservern, men det sker bara var 30 minut, och det via ett externt rapportskrivningsprogram, och där anväder vi FileDependency, som fungerar klockrent.Sv: Kontinuerlig connection mot Oracle, var lägga den?
Om du bara kör con.Close() och inte Dispose, så har .NET en inbyggd connection pooling. Den håller alltså din aconnections öppna i ett antal (180 tror jag) sekunder efter sista anropet.
Detta BÖR vara tillräckligt för Oracle, då det är tillräckligt på SQL Server.
Prova att köra Close, men inte dispose, så skall du se att .NET fixar jobbet under skalet...
/mickeSv: Kontinuerlig connection mot Oracle, var lägga den?
Sv: Kontinuerlig connection mot Oracle, var lägga den?
<code>
If SqlConn Is Nothing Then
SqlConn = New SqlConnection(Current.Application("strCon"))
End If
Dim Cmd As New SqlCommand("SELECT viewname, statserverstatname, statvalue FROM RTS_DATA_VIEWS", SqlConn)
If Not SqlConn.State = ConnectionState.Open Then
SqlConn.Open()
End If
Dim dataReader As SqlDataReader = Cmd.ExecuteReader()
Cmd.Dispose()
Dim hTable As New Hashtable
Do While dataReader.Read
hTable.Add(dataReader(0) & dataReader(1), dataReader(2))
Loop
dataReader.Close()
</code>
Har testat att köra en SqlConn.Close efter det att jag stängt dataReadern
Då körs koden:
SqlConn = New SqlConnection(Current.Application("strCon"))
lika förjordat...
Med koden ovan när jag struntar i att köra Close på min connection, så är den öppen hela tiden.
Jag tycker personligen att det skall stängas mm efter varje interaktion mot db, men när jag jobbar kontinuerligt med bara tio sekunders intervall har db-gurus på Oracle-sidan sagt att det är bättre att hålla connection öppen hela tiden.Sv: Kontinuerlig connection mot Oracle, var lägga den?
Connection poolen brukar ha 5(kan man ändra på själv) connections som den har öppnat mot databasen som du kan använda dig av. Det betyder att när du gör en NEW på en SQLConnection så går .NET ner i poolen och kollar om det finns en ledig öppen connection att använda. När du sedan gör .Close() på den så släpps den tillbaka till poolen, där den ligger öppen och väntar på att någon skall använda den.
Hur connection poolen fungerar för Oracle vet jag inte, men det är mycket möjligt att du i din connectionstring måste deklarerar att du vill använda en pool. Kom också ihåg att en pool gör sig bäst där connectionsträngen är exakt likadan för alla användare.
- MagnusSv: Kontinuerlig connection mot Oracle, var lägga den?
Jag tycker med att det låter rimligt att köra åtminstone Close på connection.
Läste nånstans (glömt var) att man tydligen måste deklarera i web.config eller nåt att man skall använda sig av connection pooling.
Är det ett måste att deklarera i web.config, eller är det en "freebie" från MS, "som bara fungerar" som det är?Sv: Kontinuerlig connection mot Oracle, var lägga den?
Hur det är mot andra databaser vet jag inte, men har för mig att man skriver i sin connectionstring om man vill använda connection pool eller ej, finns säkert något bra Oracle forum som kan reda ut det till dig.
- Magnus