webForumDet fria alternativet

Connection pooling och Mysql

.NET

2 svar · 263 visningar · startad av Lukaspojken

Medlem sedan maj 20011 312 inlägg
Frågan#1

Jag har tänkt ge mig på att testa att bygga en skiktad lösning för ett relativt stort system men jag vet inte riktigt hur .net stödjer connection pooling för mysql. I traditionell asp så var det bra att göra alla databasanrop på en plats i koden för att få en hyffsad prestanda. Men i .net så är jag lite rädd för att prestandan ska ta skada av att man från gränssnittet går ner till datalagret och sedan upp igen. Har man flera anrop så kan det väl bli lite tungt eller är detta kanske inte några problem pga "connection poolingen"? Och hur är det med "connection pooling" och mysql? Några som har erfarenheter eller tips i området?

Medlem sedan maj 20012 812 inlägg
#2

Men i .net så är jag lite rädd för att prestandan ska ta skada av att man från gränssnittet går ner till datalagret och sedan upp igen

Det som tar tid är användningen av databaser, inte att du har delat upp din applikation i flera lager. Visst det finns en prestanda hit i att anropa 10 metoder istället för att skriva samma kod i en metod. Dock så är den prestanda hiten så försvinnande liten att de vinster du får med att dela upp din applikation i flera lager med råge överväger den försvinnande lilla prestand förlust då får.

Har man flera anrop så kan det väl bli lite tungt eller är detta kanske inte några problem pga "connection poolingen"?

Nu har inte connection poolingen så mycket med "flera anrop" att göra, eftersom du kommer att vara tvungen att göra dessa anrop varesig du vill eller ej, eftersom de krävs i din kod.

Vad connection poolingen är bra till är att när du gör flera anrop, så kan man göra det på 2 sätt.

1. Öppna databasen, gör alla dina anrop, stäng databasen
2. Öppnar och stänger databasen vid varje anrop.

I exempel 1 så kapslar du in alla dina anrop i en öpen koppling, och på detta vis så kan man öka prestandan, eftersom man bara öppnar sin koppling 1 gång.

I exempel 2 så kasplar du in varje anrop i en egen koppling, det betyder att du får öppna och stänga din databas lika många gånger som du gör anrop och det är detta som tar tid, att öppna en databaskoppling, det du vinner är skalbarhet. Alltså om din databas bara kan ha 10 öppna kopplingar, så kan du i exempel 1 inte ha mer än 10 besökare samtidigt på din site, men där du i exempel 2 kan ha fler än 10 eftersom alla inte samtidigt kommer ha en öppen koppling mot databasen (den är ju faktiskt stängd ibland).

För att då minska ner den prestandförlust det blir att öppna och stänga kopplingen hela tiden, så använder man sig av connectionpooling, där det då finns några öppna kopplingar som programmet kan använda sig av.

Säg nu att vi i vårt exempel skrivit koden så att lika mycket tid läggs på databasanrop som på övrig kod. I exempel 1 så kommer 10 besökare kräva 10 öppna kopplingar, eftersom vi först öppnar koppling, gör all kod, och sedan stänger den. I exempel 2 så öppnar vi bara kopplingen när vi behöver den, och har den stängd när vi exekverar annan kod, om det ny tar lika mycket tid, så kan vi säga att hälften använder databasen, medans hälften exekverar kod, i exempel 2 så behöver vi alltså bara ha 5 samtidiga kopplingar mot databasen. Om vi har en connectionpool med 5 kopplingar i, så klara sig vår lösning i exempel 2 med dem, medans exempel 1 måste öppna 5 till. Alltså har vi fått sämre prestand med exempel 1 än med exempel 2 eftersom det tar längre tid att öppna en koppling, än att kontrollera om det finns en ledig i connectionpoolen.

Så vårt system har med exempel 2, blivit både mer skalbart och fått en bättre prestanda.

Angående MySQL och connectionpooling, så har jag svårt att tro att de inte använder sig av det default, då nästan alla andra databaser gör det. Vad man skall komma ihåg om man skall använda sig av connection pooling är att connectionsträngen måste se exakt likadan ut.

Så om du har exempel 2 och har 10 olika användera och man använder deras rättigheter så kommer man få 10 olika connectionstrings och connectionpoolen har spelat ut sin roll. Om du däremot har samma connectionstring för alla dina använderar oberonde av vem det är, så har du en vinst med connectionpoolen.

- M

Medlem sedan maj 20011 312 inlägg
#3

Tack för ett väldigt bra och konkret svar! :)

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