08. august 2005 - 09:58
Der er
12 kommentarer og 1 løsning
Mysql: Too many conections - hjælp
Jeg h<r følgende procedure, som kommer med fejlmeddelelsen "Too many conections" når den køres knap 100 gange. Dette forstår jeg ikke helt da jeg lukker forbindelsen efter hvart kald. Nogen der kan finde fejlen: procedure hentbruger(); begin brugervalg := 1; OpretForbindelse(server,database,brugernavn,password); SQLQuery.SQL.Text:='SELECT * FROM brugere WHERE medlemsnr = '+form1.brugernr.Text; SQLQuery.Open; Form1.medlemsnr.Caption := SQLQuery.FieldByName('medlemsnr').AsString; Form1.fornavn.Text := SQLQuery.FieldByName('fornavn').AsString; Form1.efternavn.Text := SQLQuery.FieldByName('efternavn').AsString; Form1.adresse.Text := SQLQuery.FieldByName('adresse').AsString; Form1.postnr.Text := SQLQuery.FieldByName('postnr').AsString; Form1.city.Text := SQLQuery.FieldByName('city').AsString; Form1.tlf.Text := SQLQuery.FieldByName('tlf').AsString; Form1.mobil.Text := SQLQuery.FieldByName('mobil').AsString; Form1.email.Text := SQLQuery.FieldByName('email').AsString; Form1.dd.Text := SQLQuery.FieldByName('dd').AsString; Form1.mm.Text := SQLQuery.FieldByName('mm').AsString; Form1.yy.Text := SQLQuery.FieldByName('yy').AsString; Form1.hold.Text := SQLQuery.FieldByName('hold').AsString; Form1.brugersaeson.Text := SQLQuery.FieldByName('saeson').AsString; Form1.bemaerk.Text := SQLQuery.FieldByName('bemaerk').AsString; brugervalg := 0; try Form1.betalingsdato.Caption := SQLQuery.FieldByName('betalingsdato').AsString; Form1.betalt.Visible := false; except Form1.betalingsdato.Caption := ''; end; Form1.betalingsperiode.Caption := SQLQuery.FieldByName('betalingsperiode').AsString; Form1.giroudskrevet.Caption := SQLQuery.FieldByName('giroudskrift').AsString; SQLQuery.Close; SQLQuery.Destroy;
Annonceindlæg fra Deloitte
08. august 2005 - 09:59
#1
end;
08. august 2005 - 10:04
#2
Du har SQLQuery.Close; men hvad med forbindelsen/connection ?
08. august 2005 - 10:08
#3
Opretter forbindelse med følgende funktion: procedure OpretForbindelse(server,database,brugernavn,password : String); begin HentReg(); SQLConnection:=TSQLConnection.Create(nil); SQLConnection.LoginPrompt:=false; SQLConnection.ConnectionName:='MySQL'; SQLConnection.DriverName:='MYSQL'; SQLConnection.GetDriverFunc:='getSQLDriverMYSQL'; SQLConnection.LibraryName:='dbexpmysql.dll'; SQLConnection.VendorLib:='LIBMYSQL.dll'; try SQLConnection.Params.Values['Hostname']:= server; SQLConnection.Params.Values['Database']:= database; SQLConnection.Params.Values['User_Name']:= brugernavn; SQLConnection.Params.Values['Password']:=password; SQLConnection.AutoClone:=false; SQLQuery:=TSQLQuery.Create(nil); SQLQuery.SQLConnection:=SQLConnection; SQLConnection.Open; except ShowMessage('Database indstillingerne er ikke korrekte'); end; end;
08. august 2005 - 10:12
#4
Så mon ikke du også et sted skal have SQLConnection.Close; Ellers kunne du i en Delphi-applikation, overveje at åbne forbindelsen een gang for alle, og først lukke den når programmet er færdigt.
08. august 2005 - 10:15
#5
Kanon. Prøvede først at åbne forbindelsen en gang for alle, men med 40 forskellige databasekald, afbrød den forbindelsen.
08. august 2005 - 10:24
#6
Lægger du et svar?
08. august 2005 - 10:57
#7
lubker >> I Øvrigt kan du med stor fordel genbruge den samme SQLConnection : 1) Lav OpretForbindelse() om : Function OpretForbindelse(const server,database,brugernavn,password : String) : TSQLConnection; begin HentReg(); Result:=TResult.Create(nil); Result.LoginPrompt:=false; Result.ConnectionName:='MySQL'; Result.DriverName:='MYSQL'; Result.GetDriverFunc:='getSQLDriverMYSQL'; Result.LibraryName:='dbexpmysql.dll'; Result.VendorLib:='LIBMYSQL.dll'; try Result.Params.Values['Hostname']:= server; Result.Params.Values['Database']:= database; Result.Params.Values['User_Name']:= brugernavn; Result.Params.Values['Password']:=password; Result.AutoClone:=false; except ShowMessage('Database indstillingerne er ikke korrekte'); end; end; 2) Lav hentbruger() om : procedure hentbruger(const aConmnection : TSQLConnection); var SQLQuery : TSQLQuery; begin SQLQuery := TSQLQuery.Create(nil); SQLQuery.SQLConnection:=SQLConnection; SQLQuery.SQL.Text:='SELECT * FROM brugere WHERE medlemsnr = '+form1.brugernr.Text; SQLQuery.Open; Form1.medlemsnr.Caption := SQLQuery.FieldByName('medlemsnr').AsString; Form1.fornavn.Text := SQLQuery.FieldByName('fornavn').AsString; Form1.efternavn.Text := SQLQuery.FieldByName('efternavn').AsString; Form1.adresse.Text := SQLQuery.FieldByName('adresse').AsString; Form1.postnr.Text := SQLQuery.FieldByName('postnr').AsString; Form1.city.Text := SQLQuery.FieldByName('city').AsString; Form1.tlf.Text := SQLQuery.FieldByName('tlf').AsString; Form1.mobil.Text := SQLQuery.FieldByName('mobil').AsString; Form1.email.Text := SQLQuery.FieldByName('email').AsString; Form1.dd.Text := SQLQuery.FieldByName('dd').AsString; Form1.mm.Text := SQLQuery.FieldByName('mm').AsString; Form1.yy.Text := SQLQuery.FieldByName('yy').AsString; Form1.hold.Text := SQLQuery.FieldByName('hold').AsString; Form1.brugersaeson.Text := SQLQuery.FieldByName('saeson').AsString; Form1.bemaerk.Text := SQLQuery.FieldByName('bemaerk').AsString; brugervalg := 0; try Form1.betalingsdato.Caption := SQLQuery.FieldByName('betalingsdato').AsString; Form1.betalt.Visible := false; except Form1.betalingsdato.Caption := ''; end; Form1.betalingsperiode.Caption := SQLQuery.FieldByName('betalingsperiode').AsString; Form1.giroudskrevet.Caption := SQLQuery.FieldByName('giroudskrift').AsString; SQLQuery.Close; FreeAndNil(SQLQuery); end; 3) Kald det sådan her ; var AConnection : TSQlConnection; i : Integer; begin AConnection := OpretForbindelse(server,database,brugernavn,password); for i := 1 to 100 do hentbruger(AConnection); AConnection.Close; FreeandNil(AConnection) end; På den anden måde får du nu godtnok dine connections frigivet, men du opretter et nyt TSQLConnection object hvergang som du aldrig frigiver. Jens B
08. august 2005 - 11:04
#8
Ingen point til mig, tak.
08. august 2005 - 11:08
#9
Det er så i orden. Men takker i hvert fald for hjælpen.
08. august 2005 - 14:13
#10
Lubker>> Fik du lavet det om ?
08. august 2005 - 17:33
#11
Nej, forstår ikke helt hvor du vil hen med "for i := 1 to 100 do"
08. august 2005 - 20:41
#12
lubker>> Det der loop var bare noget jeg fandt på for at vise dig hvordan du genbruger en connection. Du har tydeligvis et andet loop der gør at din funktion bliver kaldt over 100 gange ... Det skal du naturligvis bruge i stedet for. Hvis det volder dig problemer hjælper jeg dig gerne videre. Det er noget basalt programmering som jeg mener det er vigtigt du får styr på. Jens B
08. august 2005 - 22:46
#13
Okay. Jeg kalder ikke funktionen normalt over hundrede gange bare lige sådan. Jeg har et listview, og hver gang en række bliver markeret køres funktionen. Men kan nu godt se princippet i det. Tak for det. Går igang med at lave det om i morgen.
Kurser inden for grundlæggende programmering