Avatar billede pablopablo Nybegynder
06. november 2008 - 14:37 Der er 26 kommentarer og
1 løsning

Optimering af DB klasse

Hejsa...

Vi sidder med at site som skal være i stand til at kunne håndtere en del besøgende om dagen... i snit 5.000 - 10.000 unikke besøgende om dagen...

Derfor vil jeg gerne have jer til at kigge på den klasse som håndtere al DB komm. og komme med kommentarer til hvordan vi kan forbedre den, således at den bliver så stabil og hurtigt performance mæssigt som overhovedet muligt!

Generelt er vores DB logik ikke særlig avanceret...10 inner joins er nok max...

Alt komm. til DB fungere via stored procedure... vi har omkring 70 tabeller i alt (10 system tabeller)...og ca. lige så mange stored procedurer...

http://www.unicdesign.dk/DB.txt

Noget af det jeg selv har i tankerne som måske skal ændres er følgende:

- Vi benytter kun én statisk SqlConnection til databasen.
  som bliver åbnet og lukket efter hver kald af en stored procedure.

- Vi kalder .Close() for at lukke forbindelsen. Dispose() bliver aldrig kaldt.

- cmd.CommandTimeout = 30; den overvejer vi at sætte op. God ide?

- Forbindlese som SPexecuteReader() benytter bliver åbnet i DB klassen men lukkes højere oppe i business laget...se bunden af TXT filen for et lille eksempel!

Alle kloge hoveder sig jeres mening! :-)

På forhånd tak!

Mvh. PabloPablo
Avatar billede arne_v Ekspert
06. november 2008 - 14:49 #1
Tja - en static connection betyder jo at web app kune understøtter en enkelt samtidig bruger, så den skal ihvertfald laves om !
Avatar billede kalp Novice
06. november 2008 - 16:42 #2
Hvis der er meget aktivitet på sitet så er det nok lidt dyrt hele tiden og skulle oprette og lukke database forbindelser.

Det skader ikke, at sætte din CommandTimeout op... det kommer lidt an på hvor længe du vil lade folk vente på svar.
Avatar billede arne_v Ekspert
06. november 2008 - 16:45 #3
SqlConnection bruger connection pool, så Open og Close koster stort set ikke noget.
Avatar billede softspot Forsker
06. november 2008 - 16:49 #4
Er der ændret på principperne om at

  - "acquire connections as late as possible"
  - "release connections as soon as possible"

og i den forbindelse connectionpooling, siden ASP.NET 1.1...?
Avatar billede softspot Forsker
06. november 2008 - 16:49 #5
Nå, ok, jeg synes jo nok det princip var lidt for godt til at lægge på hylden igen :)
Avatar billede pablopablo Nybegynder
06. november 2008 - 17:45 #6
Hej igen...

Vil det sige, at det eneste I synes at jeg skal ændre, er, at fjerne "static" fra koden og så blot oprette en ny instans af vores DB klasse hver gang jeg har brug for at kalde en stored procedure?

Ser alt ellers OK ud?
Hvor mange forspørgsler kan en enkel connection ca. håndtere?
Avatar billede arne_v Ekspert
06. november 2008 - 17:47 #7
Bedste design er:
  - create and open connection
  - do query
  - close connection
Avatar billede arne_v Ekspert
06. november 2008 - 17:48 #8
Og nej - der er måske også andre problemer - static connection var bare den der sprang mest
i øjnene.
Avatar billede arne_v Ekspert
06. november 2008 - 17:49 #9
Har du kigget på DAAB ? Det ser ud som om du duplikerer meget af dens funktionalitet.
Avatar billede arne_v Ekspert
06. november 2008 - 17:50 #10
Og for en god ordens skyld:

enten skal alt laves ikke-static eller så skal connections laves som lokal variabel
i metoderne
Avatar billede arne_v Ekspert
06. november 2008 - 17:52 #11
småting:

if (storedProducere == null && storedProducere == null)

ligner et test der er dobbelt så godt som der er brug for.

:-)

string storedProducere

generelt bør man undgå stave-fejl i navne - det kan forvirre folk.
Avatar billede arne_v Ekspert
06. november 2008 - 17:53 #12
catch (Exception error)
        {
            System.Web.HttpContext.Current.Trace.Write("FEJL VED SKRIVNING TIL DB: " + error.ToString());
        }

kan jeg ikke lide:

1)  det kobler din database med web kontekst - ikke godt

    jeg vil forslå noget som log4net

2)  skriv den slags på engelsk ikke på dansk - ellers er det svært at bringe
    udenlandske ressourcer ind i projektet
Avatar billede arne_v Ekspert
06. november 2008 - 17:54 #13
Jeg tror at du må kunne genbruge noget kode mellem dine 3 SPexecuteXxxxxxx
Avatar billede arne_v Ekspert
06. november 2008 - 17:55 #14
Her ses et eksempel af hvordan SPexecuteReader benyttes fra Business laget

....

ListBox1.Items.Add(new ListItem(sdr["LoweredEmail"].ToString(), sdr["UserName"].ToString()));

====

Er ListBox1 en del af dit business lag ????

:-)
Avatar billede pablopablo Nybegynder
06. november 2008 - 18:01 #15
Hvad er DAAB?

Jeg er helt med på: 17:47:48. (Det er det som er mit mål :-) )

haha...ja..der skulle have stået: if (storedProducere != "")

"enten skal alt laves ikke-static eller så skal connections laves som lokal variabel
i metoderne" - Den er jeg ikke helt med på?

Gider du ikke vise mig præcis hvordan du ville lave det? Hvad du ville ændre i min kode?
Avatar billede arne_v Ekspert
06. november 2008 - 18:08 #16
Avatar billede pablopablo Nybegynder
06. november 2008 - 18:10 #17
System.Web.HttpContext.Current.Trace.Write("FEJL VED SKRIVNING TIL DB: " + error.ToString());

er kun TEMP idet at jeg brugte remote debug...normal benytter jeg en metode som skriver exceptions til DB...men idet at den nuværende struktur i vores DB klasse ikke er optimal, så fejlede det nogle gange at at kalde den...det kan vi vende tilbage til når jeg har styr på grund designet af DB klassen ;)

Ang. 17:55:58: Nej...UI laget...men tilgengæld benytter jeg ofte ikke business laget til noget, idet at det ofte ikke give så meget mening andet en bare at gøre det - for at gøre det...hehe...så derfor: UI --> DB klasse --> DB...
Avatar billede arne_v Ekspert
06. november 2008 - 18:10 #18
Det er enten:

public class DBFun
{
  private SqlConnection con;
  public DBFun()
  {
      con = ...
  }
  public void DoSomething(...)
  {
      ...
  }
}
       
eller

public static class DBFun
{
  public static void DoSomething(...)
  {
      SqlConnection con = ...
      ...
  }
}
Avatar billede arne_v Ekspert
06. november 2008 - 18:12 #19
Kan du nøjes med 2 lag, så er det OK med mig. Men sørg for at kommentarer i
koden afspejler virkeligheden !
Avatar billede arne_v Ekspert
06. november 2008 - 18:12 #20
re 06/11-2008 18:10:55)

Der skal naturligvis laves noget som får lukket connection.
Avatar billede pablopablo Nybegynder
06. november 2008 - 18:18 #21
Okay...dvs. jeg kan faktisk bare nøjes med at sætte metoden: OpenDBConnection() til at oprettet en ny instans af en connection i stedet for at genbruge den statiske version...og dermed udgå at skulle rette alle steder i projektet, hvor jeg tilgår DB klassens metoder på static vis...?

Det er vel du viser mig i eks. nr. 2: 18:10:55?
Avatar billede pablopablo Nybegynder
06. november 2008 - 19:49 #22
God aften igen... jeg har nu rettet i TXT filen og tilføjet min LOG metode...

Har du Arne eller i andre noget at tilføje?
Avatar billede arne_v Ekspert
07. november 2008 - 03:08 #23
Det ser meget bedre ud.

Jeg tror stadig at noget af parameter håndteringen kunne genbruges mellem de 3 store metoder.
Avatar billede pablopablo Nybegynder
07. november 2008 - 14:16 #24
Hej igen Arne!

Ja det har du helt ret i.
Dog er det vigtigste lige nu at koden rent funktionelt spiller MAX! :-)

Er koden helt "perfekt" på dette område nu? Hvis ja, så læg blot et svar ;) Og 1000 tak for hjælpen! Du har efterhånden reddet mange af mine dage ;)
Avatar billede arne_v Ekspert
08. november 2008 - 02:39 #25
Der er ikke lige noget som springer i øjnene.

Jeg ville close connection i finally eller bruge using, men ...

Og svar.
Avatar billede pablopablo Nybegynder
09. november 2008 - 17:34 #26
Hej Arne...idet at jeg ønsker at skrive til databasen hvis der opstår en fejl...så lukker jeg forbindelsen til databasen i catch og opretter derefter en ny connection som bruges til at reg. den konkrete fejl i databasen...

dette er grunden til mit valgt...men ja, man kan jo gøre det samme på flere måder...
Avatar billede arne_v Ekspert
09. november 2008 - 19:42 #27
Men har du ens kode i normal flow og i catch, så kan du jo nøjes med at have en kopiaf koden i finally.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester



IT-JOB

Politiets Efterretningstjeneste

Centerchef til Center for Support og Proces i PET

De Nationale Geologiske Undersøgelser for Danmark og Grønland (GEUS)

IT-systemadministrator søges til GEUS

Capgemini Danmark A/S

Salesforce CTO - Nordics