Lazarus 0.9.20, SQLdb, MySQL 4.1: Server connect failed

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
LigH
Beiträge: 25
Registriert: Mi 20. Sep 2006, 09:54

Lazarus 0.9.20, SQLdb, MySQL 4.1: Server connect failed

Beitrag von LigH »

Folgende Installation liegt vor:

- Windows XP SP2
- MySQL 4.1.14 für Win32 als NT-Dienst (mysqld.exe)
- frisch installiertes Lazarus Version 0.9.20
- alle DLL-Dateien aus der MySQL-Installation in das Projekt-Verzeichnis kopiert
- TMySQL41Connection <-=-> TSQLQuery <-=-> TSQLTransaction

Folgende Versuche schlugen bereits fehl:

Code: Alles auswählen

connMySQL.HostName := '';
  connMySQL.DatabaseName := 'mysql';
  connMySQL.UserName := 'root';
  connMySQL.Password := '';
  try
    connMySQL.Open;

(EDatabaseError) connMySQL : Server connect failed.


Code: Alles auswählen

connMySQL.HostName := 'localhost';
  connMySQL.DatabaseName := 'mysql';
  connMySQL.UserName := 'root';
  connMySQL.Password := '';
  try
    connMySQL.Open;

(EDatabaseError) connMySQL : Server connect failed.


Code: Alles auswählen

connMySQL.HostName := '{WINS-Name}';
  connMySQL.DatabaseName := 'mysql';
  connMySQL.UserName := 'root';
  connMySQL.Password := '';
  try
    connMySQL.Open;

(EDatabaseError) connMySQL : Server connect failed.


#0 fpc_raiseexception(, , ) at :0
#1 DATABASEERROR(, ) at :0
#2 MYSQLERROR(, , ) at :0
#3 TMYSQL41CONNECTION__CONNECTMYSQL(, , , , ) at :0
#4 TMYSQL41CONNECTION__CONNECTTOSERVER() at :0
#5 TMYSQL41CONNECTION__DOINTERNALCONNECT() at :0
#6 TDATABASE__SETCONNECTED(, ) at :0
#7 TDATABASE__OPEN() at :0
#8 TFMBBEDIT__FORMCREATE((^TOBJECT) $139560, (^TFMBBEDIT) $139560) at BBUnit.pas:48
#9 TCUSTOMFORM__DOCREATE((^TCUSTOMFORM) $139560) at customform.inc:614
#10 TCUSTOMFORM__CREATE((^TCOMPONENT) $d53b0, (POINTER) $1, (^TCUSTOMFORM) $139560) at customform.inc:1297
#11 TAPPLICATION__CREATEFORM($554ed0, void, (^TAPPLICATION) $d53b0) at application.inc:1523
#12 main at Project1.lpr:16


Was habe ich nun übersehen? Vielleicht ein paar Params[]?
__

Übrigens finde ich nicht gerade, dass die Beschreibung in der Wiki bereits umfassend ist. Was ich auf jeden Fall vermisse, sind Hinweise dazu, welche Werte für die einzelnen Properties erlaubt sind. Beispielsweise sollte man wissen, ob der Wert 'localhost' den speziellen Socket-Modus aktiviert, und wenn ich über das lokale Netz auf einen anderen PC zugreifen will, ob ich dann den WINS-Namen verwenden kann, oder die IP-Nummer wissen muss.

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Beitrag von monta »

Da ich fast nur Datenbanken programmier, versuch ich mal ne Lösung ;).
Ich verwende immer TIbConnection, sollte aber für TMysqlConnection identisch sein.

versuch mal

Code: Alles auswählen

connMySQL.Connected := true;


Also Hostname bleibt bei localhost leer.

Bei Host müste eigentlich der dateiname rein und das mit Dateiendung, auch wenn Windows die ausblendet.

Ansonsten kann eigentlich nur den Nutzer bzw. PW nicht stimmen. Bist du sicher, das ausgerechnet der root kein Passwort haben soll, wäre ja etwas kontraproduktiv, oder hast du das PW selbst vergeben bzw. hier nur gelöscht?
Zuletzt geändert von monta am Mi 31. Jan 2007, 16:04, insgesamt 1-mal geändert.

LigH
Beiträge: 25
Registriert: Mi 20. Sep 2006, 09:54

Beitrag von LigH »

Code: Alles auswählen

connMySQL.Connected := true;


Interessant: Funktionierte ein Mal, danach erst wieder, nachdem ich die Lazarus-IDE geschlossen und neu geöffnet habe.

Anscheinend wird die libmysql.dll bzw. die Verbindung nicht wieder zuverlässig freigegeben. Ich versuche also mal:

Code: Alles auswählen

{ ... }
begin
  connMySQL.HostName := '';
  connMySQL.DatabaseName := 'mysql';
  connMySQL.UserName := 'root';
  connMySQL.Password := '';
  try
    if connMySQL.Connected then connMySQL.Connected := false;
    connMySQL.Connected := true;
    if connMySQL.Connected
    then begin
{ ... }

__

P.S.: Hilft aber auch noch nicht endgültig: Ich muss die Lazarus-IDE immer beenden, nachdem ich debuggt habe.

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Beitrag von monta »

Steht Connected im OI auf true oder false? Wenns auf false steht gehts zumindest bei mir problemlos.

Aber du könntest probieren, ob ein zurücksetzen des Debuggers vielleicht den Neustart zumindest behebt, sollte eigentlich dadurch eventuelle Reste entladen. (Start > Debugger zurücksetzen)

LigH
Beiträge: 25
Registriert: Mi 20. Sep 2006, 09:54

Beitrag von LigH »

Am Anfang ist die MySQLConnection nicht aktiv.

Das Zurücksetzen des Debuggers hat schon mal geholfen. Allerdings bringt mit das ganze nach mehreren Tausend Zugriffen dann wieder die gleiche nichtssagende Meldung...

Da ist noch irgend was nicht ausgereift.

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Beitrag von monta »

Was genau verstehst du den unter mehreren tausend Zugriffen?

Hast du tausende Selects?

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

nach und nach sicher ...
ich hab aber die selben erfahrungen gemacht nach ein paar zugriffen kommts immer zu mysteriösen fehlern
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Beitrag von monta »

kann ich nicht bestätigen, ich geb zu, die Koponenten sind recht trickreich und laufen auch mal quer, aber wenn es erstmal geht und alles eingestellt ist und man solche kleinen Schwächen wie beispielsweise die Tatsache, das ein Connect nicht das selbe ist, wie ein Connected := true, dann gehen sie eigentlich problemlos.

Zumindest meine Erfahrung, mit Firebird - logischer Weise über IbConnection.

Zumindest die Datenbankverbindung würde ich eigentlich im Normalfall beibehalten und nur einmal initialisieren, was auch verhindert, dass die aktiven Queries beispielsweise querschlagen.

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Firebird <> MySQL
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

LigH
Beiträge: 25
Registriert: Mi 20. Sep 2006, 09:54

Beitrag von LigH »

monta hat geschrieben:Was genau verstehst du den unter mehreren tausend Zugriffen?

Hast du tausende Selects?


Richtig: Zehntausendfach Berechnung eines Indexwertes, und SELECT-Zugriff auf alle Datensätze, in denen dieser Indexwert vorkommt. Und das innerhalb von wenigen Sekunden.

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Beitrag von monta »

Hast du schon probiert, ob ein zwischenzeitliches zurücksetzen der Verbindung etwas bewirkt?

LigH
Beiträge: 25
Registriert: Mi 20. Sep 2006, 09:54

Beitrag von LigH »

Wie meinst du das? Schließen und Öffnen der Connection aller 1000 Zugriffe - innerhalb meines Programmes?

Vielleicht lade ich auch mal (soweit möglich) die gesamte Tabelle in den RAM und suche anschließend in Records, um nicht zu häufig einzeln zuzugreifen.

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Vielleicht lade ich auch mal (soweit möglich) die gesamte Tabelle in den RAM und suche anschließend in Records, um nicht zu häufig einzeln zuzugreifen.


kannst du kein anderes dbs nehmen ? muss es mysql sein ?
wenn ja würd ich versuchen der sache auf den grund zu gehen ist ja keine hexerei
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

LigH
Beiträge: 25
Registriert: Mi 20. Sep 2006, 09:54

Beitrag von LigH »

Die Firmen-Datenbank ist ja schon etabliert ... ich kann natürlich versuchen, auch mal zwischendurch ein anderes DBMS zu versuchen, z.B. Access 2000 via ODBC, aber es wäre nicht Sinn der Sache.

"Der Sache auf den Grund gehen" könnte ich wesentlich besser, wenn die Fehlermeldungen etwas detaillierter wären. Und da andere Zugriffsmethoden (z.B. per PHP) damit keine Probleme zeigen, sehe ich nur zwei mögliche Ursachen:

1) Die Implementation in FreePascal übersieht eine Kleinigkeit;
2) meine Implementation ist irgendwo grundlegend falsch.

Im Fall 1) wäre meine Zugriffsroutine dann sozusagen ein "Stresstest", der eine Schwäche aufgedeckt hat. ;)

Und im Fall 2) muss ich mir halt was einfallen lassen, um seltener zuzugreifen.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6209
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Beitrag von af0815 »

@LigH
Fange mal schon bei 2) an und mache ein Mindestbeispiel zum Testen, wo Dein Problem auftaucht (Mysql Tabellen nicht vergessen, zumindest Deklarationen). Markiere die Zeilen im Code, schreibe noch dazu, welcher Compiler und lade das ganze hier herauf. Dann kann ein jeder, der MySQL am Rechner hat das ganze mal probieren nach zu vollziehen. Vielleicht fällt da was auf.
Damit kann man dann eingrenzen wo das Problem ist - bei 1 oder bei 2.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten