webForumDet fria alternativet

en fundering

.NET

5 svar · 314 visningar · startad av DavidB

Medlem sedan jan. 20001 372 inlägg
Frågan#1

Har alltid använt mig utav "lager metoden" när jag hämtar data
från min databas och jag måste säga att visst är det smidigt men
jag satt och funderade på en sak.

Håller nämligen på med en ny sida och den kommer att få ganska
så många besökare så jag funderade på om den här metoden
verkligen är så bra.

Säg att jag har en sida som använder denna metoden och jag
skall hämta massa data till denna sida med hjälp av olika sql
frågor, då e ju problemet det att databasen kommer att öppnas
och stängas väldigt mycket (en gång per sql fråga om jag gör så
som jag gör nu). Detta känns ju inte så bra i prestandamässig
synpunkt.

Nån som har någon bra ide på hur amn skulle kunna lösa detta?
Hade ju kunnat ta bort lagrerna helt och lägga allt direkt på
sidorna.

Mvh David

Medlem sedan jan. 20012 204 inlägg
#2

Nja blir nog inte så stor prestandardförlust så fortsätt du på samma bana.

Medlem sedan dec. 20003 563 inlägg
#3

Håller med. Kör på med lagersystemet!

Medlem sedan mars 20007 896 inlägg
#4

Snabbhet är ju inte alltid det viktigaste, bygger du i lager vinner du i flexabilitet och skalbarhet. Inte för att jag tror att det skulle bli någon prestandaförlust som är märkbar, men som argument för att ha kvar modultänket.

Medlem sedan sep. 20011 914 inlägg
#5

Ta ut hur mycket data du vill med endast en öppning.

public class Lalala{
   protected Repeater rep1, rep2;
   private void Page_Load(Object sender, EventArgs e){
      if(!IsPostBack){
         BindData();
      }
   }

   public void BindData(){
      Hihihi objHihihi = new Hihihi();
      object[] obj = objHihihi.ReturnALotOfData();

      rep1.DataSource = obj[0];
      rep2.DataSource = obj[1];
      rep1.DataBind();
      rep2.DataBind();

      objHihihi = null;
   }
}

public class Hihihi{
   public object[] ReturnALotOfData(){
      string s = "SELECT cc1_a, cc1_b, cc1_c FROM cc1 SELECT cc2_d, cc2_e, cc2_f FROM cc2";
      SqlDataReader dr = SqlHelper.ExecuteReader(connG, CommandType.Text, s);
			
      ArrayList arrCC1 = new ArrayList();
      ArrayList arrCC2 = new ArrayList();
      while(dr.Read()) {
         arrCC1.Add(new cc1(dr.GetString(0),dr.GetString(1),dr.GetString(2)));
      }
				
      dr.NextResult();
      while(dr.Read()) {
         arrCC2.Add(new cc2(dr.GetString(0),dr.GetString(1)));
      }
      dr.Close();
      object[] obj = new object[2];
      obj[0]  = arrCC1 ;
      obj[1]  = arrCC2 ;
      return obj;
   }
}
Medlem sedan maj 20012 812 inlägg
#6

då e ju problemet det att databasen kommer att öppnas
och stängas väldigt mycket (en gång per sql fråga om jag gör så
som jag gör nu). Detta känns ju inte så bra i prestandamässig
synpunkt.

Detta kan bli ett STORT prestandaproblem för dig om du verkligen skapar en ny connection varje gång som du anropa din databas, och det är ju inte speciellt bra. Så varför har ingen tänkt på det?

Givetviss har man gjort detta och man har därför skapat en lösning till just detta problem och det kallas connectionpool. Alltså man skapar några databaskopplingar (brukar var 5) och lägger dessa i en pool.

Dessa ligger bara där skapade och färdiga att användas, så när du skapar en databaskoppling så kollar man i poolen om det finns en ledig koppling och finns det så använder man den. Vilket gör att man slipper prestandaförlusten att skapa en databaskoppling (för det är långsamt). Och när du är färdig med databaskopplingen så läggs den tillbaka i poolen så någon annan kan använda sig av kopplingen.

Detta betyder att man skall hålla sin databaskoppling öpen så KORT tid som möjligt. Alltså ÖPPNA, ANROPA, STÄNG. Det betyder också att det inte är speciellt bra att använda sig av en DataReader om man tänker göra en massa saker med denna data, en DataReader är extremt snabb om man bara presenterar datan i en Repeater eller binder till något objekt.

Skall du däremot gör en massa anrop och checkar på den data som finns i din reader innan du visar den, så skall du istället använda dig av en DataTable. Denna använder en Reader för att fyllas med data, och du kan sedan stäng kopplingen till databasen, och sedan loopa igenom din DataTable och göra alla din checkar och kontroller.

Så kom ihåg att Öppna din databas så sent som möjligt och stäng den så tidigt som möjligt. Det är med andra ord bättre att göra.

ÖPPNA
ANROPA
STÄNG

ÖPPNA
ANROPA
STÄNG

ÖPPNA
ANROPA
STÄNG

ÖPPNA
ANROPA
STÄNG

Än

ÖPPNA
ANROP
ANROP
ANROP
ANROP
STÄNG

- M

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