Avatar billede c-sharp Nybegynder
20. december 2004 - 11:01 Der er 21 kommentarer og
1 løsning

Jeg får en timeout ved nogle forspørgelser til databasen

Jeg har en side med et varekatalog hvor i man kan lave en fritekst søgning. Mit problem er at hvis man søger med nogle besteme bogstav kombinationer på 3 - 4 tegn så får jeg følgende fejl:

System.Data.SqlClient.SqlException: Timeout er udløbet. Timeoutperioden udløb, før handlingen blev fuldført, eller serveren svarer ikke.

Hvis jeg f.eks. søger efter 'ben' får jeg timeout, søger jeg efter 'be' eller 'b' får jeg ingen fejl.

Jeg bruger følgende sql-sætning:

SELECT tblVare.billedeNavn, tblVare.tegningNavn, tblVare.vareId, s1.tekst AS tekst, s2.tekst AS beskrivelse, s3.tekst AS undergruppe FROM tblVare INNER JOIN tblSprog s1 ON s1.sprogId = tblVare.tekstSprogId INNER JOIN tblSprog s2 ON s2.sprogId = tblVare.beskrivelseSprogId INNER JOIN tblUnderGrupper ON tblVare.underGruppeId = tblUnderGrupper.underGruppeId INNER JOIN tblSprog s3 ON s3.sprogId = tblUnderGrupper.navnSprogId WHERE (s1.sprogKode = 'da') AND (s2.sprogKode = 'da') AND (s3.sprogKode = 'da') AND (s1.tekst like '%ben%' OR s2.tekst like '%ben%') ORDER BY tekst; SPROG: da ORGINAL SPROG: da
Avatar billede arne_v Ekspert
20. december 2004 - 11:13 #1
Jeg tror at det er tilfældigt at der er den sammenhæng mellem antal tegn
og timeout.

Under alle omstændigheder er LIKE '%xxx%' er meget dyr sammenligning.

Så du ligger sikkert lige på grænsen.
Avatar billede c-sharp Nybegynder
20. december 2004 - 11:19 #2
Det jeg synes er lidt mærkelig er at 'ben' ikke retunere så mange resultater som 'b', men det er ved søgningen efter 'ben' at jeg får timeout.

Hvad kan jeg gøre for at løse problemet, kan jeg sætte timeout tiden op?
Avatar billede arne_v Ekspert
20. december 2004 - 11:22 #3
Ja.
Avatar billede arne_v Ekspert
20. december 2004 - 11:23 #4
Men overvej om dine brugere kan leve med at skulle søge fra start af så det bliver:

LIKE 'xxx%'

fordi så kan databasen bruge index og køre rimeligt hurtigt.
Avatar billede c-sharp Nybegynder
20. december 2004 - 11:27 #5
Det er et krav at man skulle kunne søge '%xxx%'!

Jeg kan se i Server Enterprice Manager at min side har ca 20 forbindelse der har status "sleeping" kan det være et problem? skal jeg lukke forbindelsen manuelt (Bruger Microsoft Applikation Block til at komunikere med databasen)?
Avatar billede trumf Nybegynder
20. december 2004 - 12:09 #6
Hvis der er tale om connections hvor f.eks user ID eller password er forskellige kunne du måske prøve at sætte Connection Lifetime ned (hvis den ikke er sat er den default, som vist nok er 20) til f.eks. 10
Avatar billede arne_v Ekspert
20. december 2004 - 23:08 #7
Jeg tror ikke på at connection pool size er problemet.
Avatar billede c-sharp Nybegynder
21. december 2004 - 08:36 #8
Hvad skal jeg helt konkret gøre for at løse problemet?
Avatar billede arne_v Ekspert
21. december 2004 - 08:46 #9
SqlCommand klassen har en CommandTimeout property som du kunne prøve at øge
Avatar billede c-sharp Nybegynder
21. december 2004 - 09:14 #10
Kunne det hjælpe at bruge en stored procedure?
Avatar billede arne_v Ekspert
21. december 2004 - 09:17 #11
Lidt. Men grundliggende ser din SQL meget dyr ud.
Avatar billede c-sharp Nybegynder
21. december 2004 - 13:28 #12
Hvordan bruger jeg sqlCommand klassen?
Avatar billede arne_v Ekspert
21. december 2004 - 14:03 #13
Bruger du ikke allerede den ?
Avatar billede c-sharp Nybegynder
21. december 2004 - 14:11 #14
Jeg bruger Microsoft Applikation Block til database komunikation.
ds = SqlHelper.ExecuteDataset(connStr, CommandType.Text, sql);

Men jeg kan da godt prøver at lave en alm. adgang:
SqlConnection conn = new SqlConnection(connStr);
SqlDataAdapter adapter = new SqlDataAdapter(sql, conn);
SqlCommandBuilder builder = new SqlCommandBuilder(adapter);
adapter.Fill(ds, "table");

Mne der bruger jeg da heller ikke sqlCommand direkte?
Avatar billede arne_v Ekspert
21. december 2004 - 14:24 #15
adapter.SelectCommand.CommandTimeout =
adapter.InsertCommand.CommandTimeout =
adapter.DeleteCommand.CommandTimeout =
adapter.UpdateCommand.CommandTimeout =
Avatar billede c-sharp Nybegynder
21. december 2004 - 14:57 #16
Jeg har sat adapter.SelectCommand.CommandTimeout = 45 også virker det :-)

Bør jeg afbryde database forbindelse efter søgningen?

Arne_v Smid et svar så får du point, og mange tak for din hjælp!
Avatar billede arne_v Ekspert
21. december 2004 - 15:08 #17
svar
Avatar billede arne_v Ekspert
21. december 2004 - 15:08 #18
ja - men det betyder ikke noget for dit problem
Avatar billede c-sharp Nybegynder
21. december 2004 - 15:15 #19
Bliver den ikke taget af garbagecollector'en?
Avatar billede arne_v Ekspert
21. december 2004 - 15:16 #20
Jo - men det kan tage tid inden den kører.
Avatar billede c-sharp Nybegynder
21. december 2004 - 15:34 #21
Så man bør altid skrive conn.dispose ?
Avatar billede arne_v Ekspert
21. december 2004 - 15:42 #22
conn.Close();
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