Avatar billede lubker Nybegynder
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;
Avatar billede lubker Nybegynder
08. august 2005 - 09:59 #1
end;
Avatar billede erikjacobsen Ekspert
08. august 2005 - 10:04 #2
Du har
    SQLQuery.Close;
men hvad med forbindelsen/connection ?
Avatar billede lubker Nybegynder
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;
Avatar billede erikjacobsen Ekspert
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.
Avatar billede lubker Nybegynder
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.
Avatar billede lubker Nybegynder
08. august 2005 - 10:24 #6
Lægger du et svar?
Avatar billede borrisholt Novice
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
Avatar billede erikjacobsen Ekspert
08. august 2005 - 11:04 #8
Ingen point til mig, tak.
Avatar billede lubker Nybegynder
08. august 2005 - 11:08 #9
Det er så i orden.
Men takker i hvert fald for hjælpen.
Avatar billede borrisholt Novice
08. august 2005 - 14:13 #10
Lubker>> Fik du lavet det om ?
Avatar billede lubker Nybegynder
08. august 2005 - 17:33 #11
Nej, forstår ikke helt hvor du vil hen med "for i := 1 to 100 do"
Avatar billede borrisholt Novice
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
Avatar billede lubker Nybegynder
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.
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
Kurser inden for grundlæggende programmering

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