webForumDet fria alternativet

stänga databas

ASP

25 svar · 799 visningar · startad av eriks

Medlem sedan apr. 20011 418 inlägg
Frågan#1

Hej,

Jag vet att detta har varit uppe mkt tidigare, men jag hade gärna velat ha några specifika kommentarer på min site..

Jag gör koden till vår site. Den har ganska många databaskopplingar och jag är inte speciellt noga med att stänga varken kopplingar eller recordsets. Vår site har ca 200 besökare om dagen. Detta är ju ganska lite.

Som jag har förstått det så stängs allting när man går ut från sidan. Därför har jag inte proriterat att stänga grejerna. (Jag är lat.) Men nu har sidan börjat sega (plöstligt igårkväll). Och den segar ordentligt. Det kan ju ha någon annan anledning, men kan det bero på att jag har för många kopplingar och RS öppna? Jag har bara en Session som är öppen alltid, och sen typ 2-3 till vid beställning. Tänk på att det bara är 200 användare, alltså som mest ca 10 åt gången, och knappast många nu på förmiddagen när jag skriver.

Tack på förhand!

Mvh Erik

Medlem sedan maj 2001431 inlägg
#2

vikken databasmaskin haru? du kan i de flesta enkelt se hur många aktiva anslutningar du har.

Medlem sedan apr. 20011 418 inlägg
#3

Vad betyder det? Jag använder acess, men anslutningarna ändras väl hela tiden? (när någon ansluter)

Medlem sedan feb. 200112 078 inlägg
#4

Jag brukar jämföra förstöring av använda objekt med vanlig städning, för att gestalta problematiken i ett annat ljus, t.ex. på webbhotellservrar jämtemot en egen server. Man kan säga ungefär såhär;

På din egen server: Du är hemma och lufsar omkring i morgonrock, så kan du slänga allt skräp var du vill, när du vill och hur du vill. Ingen bryr sig. Ät en banan, släng skalet på golvet. Käka en kebab, kasta omslagspappret och överbliven kladdsås under soffbordet. Det påverkar bara dig och ingen annan och du släpper ju aldrig in någon annan, så det är ju ingen fara. Men så kommer den dagen då du märker att det knappt går att öppna dörren för allt skräp, du blir kladdig under fötterna hela tiden och du kan inte sätta dig eller dina saker någonstans utan att det blir smutsigt eller så är det skräp ivägen. Ditt enda alternativ är nu att göra en total sanering av hela lägenheten. Du märker att det är fruktansvärt tidsödande och svettigt och tråkigt och, du kunde gjort en massa andra vettiga saker istället för att städa om du, istället hade slängt skräpet i soptunnan direkt. Men du orkade ju inte.

På webbhotellet: Du bor i ett kollektiv eller ett studentboende med fyra andra personer. Du är en slarver och du städar inte, du slänger inte pizzakartongerna i soporna, du låter tvätt ligga kvar i badrummet (underkläder också!) och du har aldrig tagit i en skurhink eller mopp, för du orkar ju inte. Nu har emellertid dina vänner fått nog av ditt svineri, när de inte kan vistas i varken kök, badrum eller vardagsrum, så de sätter sig ner med dig och tvångsdiskuterar de här sakerna med dig. Du lyssnar, men du gör inget åt saken, för du orkar inte. Efter en tid är dina vänner så trötta på dig att de helt sonika ringer hyresvärden för att få dig uthyst ur lägenheten eller så vräker de dig själva. Du får nu leta upp ett nytt boende, någon annanstans.

Så, eriks, ge mig en enda anledning till varför du inte bör stänga alla databaskopplingar eller förstöra alla dina objekt när du är färdig med dem. En enda.

Medlem sedan apr. 20011 418 inlägg
#5

Som sagt, jag tror inte det finns en enda bra anledning för varför man inte bör stänga dem, men jag kan ge en anledning till varför de inte stängs, nämligen lathet. Därför håller jag på att reda ut hur viktigt det är, vilket du ju gör klart i ditt exempel.

Betyder detta alltså att det jag inte stänger slöar ner min sida och andras sidor? Spelar det märkbar roll vid ett så litet användarantal som jag pratar om? Vad drar mest kraft (att lämna en connection öppen, ett recordset öppet eller en session öppen)?

Mvh Erik

Medlem sedan okt. 20041 556 inlägg
#6

Garanterat databasanslutningen.

Lämna inte sessioner öppna i onödan heller.

Medlem sedan feb. 200112 078 inlägg
#7

Ligger du på ett webbhotell, så kommer det ställa till problem för andra kunder om du inte aktar dig.

Sessions är väldigt marginellt idag, connections är väldigt viktigt och datastrukturer som resultatset är också viktiga att stänga. Connections är nog det absolut mest kritiska, eftersom kopplingarna annars inte poolas ordentligt, vilket innebär att du får ett stort antal kopplingar som bara ligger och släpar hela tiden. I ditt exempel kan t.ex. fem klick på din sida generera ett likvärdigt antal limbo-connections, eftersom (om det nu är fler klienter på servern) kopplingarna inte hämtas ur poolen, utan istället skapas som nya, eftersom de andra inte är stängda/förstörda. Med många besökare, ja.. det blir som en kork i en flaska.

Dessutom; det är inte särskilt vackert eller godtagbart ur programmeringssynpunkt att låta bli att förstöra sina objekt. Håll på med sådana fasoner i t.ex. C eller liknande mer hårdvaru-/systemnära språk, så lever varken du eller din applikation länge. Det är bara inom de "beskyddande ramarna" för ASP och dess utövare som detta "tillåts" (?), och det är skandal anser jag personligen, eftersom det sätter tekniken och ramverket i dålig dager på grund av folk som inte vet vad de pysslar med. Eller som inte orkar.

Men, i slutändan är det givetvis ditt eget val om du vill ha en applikation som läcker som ett såll, eller snygg kod som inte förstör för andra.

Medlem sedan apr. 20011 418 inlägg
#8

Ok, tackar för svar.. Får titta över det då. Om jag har läst rätt från tidigare trådar så är det bästa att öppna connection, hämta rs, sen stänga connection, sen använda rs..?

(Skönt att det är mitt eget val iaf. Hade varit tråkigt att bli satt i ASP-fängelse. Jag programerar inte fel för att jag är ond, och detta är ett försök att rätta till mina fel.)

Om jag skulle skriva Connection = nothing längst ner på mina sidor, skulle det hjälpa upp något?

Medlem sedan feb. 200112 078 inlägg
#9

I vilken ordning, beror på vilken pekare du sätter på dina recordset. Om du inte riktigt har koll på vad jag menar med pekare, så kan vi förutsätta att du skall göra i denna ordning. ;)

1. Öppna conn
2. Hämta rs
3. Använd rs
4. Sätt rs till Nothing
5. Sätt conn till Nothing

Enligt vad jag vet, så finns .close med i destruktorn i de fallen, så därför ska man inte behöva använda det, utan bara sätta objektet till Nothing (Set objConn = Nothing).

Medlem sedan apr. 20011 418 inlägg
#10

Tack för det.. Läste runt lite och hoppas på att det räcker med = Nothing..

Som första akutåtgärd, tänkte jag stänga alla filer längst ner Set Connection = nothing.. Hjälper detta upp?

Mvh Erik

Medlem sedan feb. 200112 078 inlägg
#11

Om ditt ADODB.Connection-objekt är deklarerat med namnet "Connection", och finns på sidan, så; ja.

Medlem sedan apr. 20011 418 inlägg
#12

Ja det är det...

Det är alltså akutlösningen. Vad är följande steg? Är det prioriterat att kolla igenom koden och flytta upp stängningen så att den sker så tidigt som möljigt? Och samtidigt försöka sätta RS till nothing så tidigt som möjligt? Avslutar jag en session också med Session("somskaavslutas" = Nothing ?

Mvh Erik

Medlem sedan dec. 20014 239 inlägg
#13

Session avslutas med Session.Abandon

om jag inte minns fel.

Medlem sedan feb. 200112 078 inlägg
#14

Ungefär, avsluta kopplingar och förstör datastrukturer, iallafall så fort som möjligt utan att koden blir oläsbar. Var någonstans du gör det på själva ASP-sidan spelar mindre roll, såvida det inte är ett script som tar väldans lång tid på sig. Skillnaden mellan att stänga t.ex. ett recordset 20 rader ovanför slutet av filen och på sista raden är marginell, speciellt om du bara har HTML mellan. ;) Det är ett ställningstagande, huvudsaken är att du gör det någonstans.

En session och en sessionsvariabel är inte samma sak. Man avslutar en sessionsvariabel med

Session.Contents.Remove "dinvariabel"

medans du "tar bort" (avslutar) en session med

Session.Abandon
Medlem sedan apr. 20011 418 inlägg
#15

Ok,

Då har jag lite att jobba med. Tackar för hjälpen.

Medlem sedan apr. 20011 418 inlägg
#16

Så, nu har jag stängt längst ner på varje sida.. Men kom att tänka på. Jag har ju samma koppling överallt (infogar samma fil, connect.asp). Då stänger jag väl samma koppling som jag sedan öppnar när man klickar vidare till nästa sida, eller blir det en annan koppling? I Alt.1 är det ju egentligen bara lönt att stänga "sista" gången..

Mvh Erik

Medlem sedan dec. 19996 721 inlägg
#17

Det skapas nya kopplingar hela tiden.

Medlem sedan apr. 20011 418 inlägg
#18

Ok... I PHP, stängs kopplingarna automatiskt där?

Medlem sedan dec. 19996 721 inlägg
#19

eriks skrev:

Ok... I PHP, stängs kopplingarna automatiskt där?

Japp

Medlem sedan apr. 20031 660 inlägg
#20

HEJ!

Hur går det, fungerar det bättre efter dina åtgärder?

272 ms totalt · 4 externa anrop · v20260731065814-full.e96017d9
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
142 ms — hämta tråd, inlägg och bilagor (db)
127 ms — ändringar (db)