MariaDB und Multithreading?

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
Warf
Beiträge: 1907
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

MariaDB und Multithreading?

Beitrag von Warf »

Hey ho, ich bin aktuell damit beschäftigt eine WebApp zu schreiben welche als Backend einen fpWeb Server (später fastcgi) verwendet. Das frontend aktualisiert regelmäßig daten mittels ajax(javascript)
Zur Datenverwaltung verwende ich MariaDB mit eine TMySQL56Connection.

Jetzt habe ich das Problem das wenn der Webserver Threading aktiviert hat, ich bei dem 4. oder 5. Request plötzlich die ESQLDatabaseError Exception bekomme, mit dem Text: TMySQL56Connection: Server Connect Failed.

Das passiert allerdings nur bei Multithreading. Ohne Threading läuft alles problemlos.
Da ich mich weder mit MariaDB/MySQL auskenne, noch mit den Lazarus Connector Klassen, benötige ich nun etwas rat. Habe ich eventuell was in Lazarus falsch gemacht (code unten) oder muss ich MariaDB erst zum concurrent zugriff konfigurieren?

PS: MariaDB läuft nicht auf localhost

Relevanter Codeauschnitt:

Code: Alles auswählen

 
    tok := ARequest.CookieFields.Values['TSASession'];
    Root := IncludeTrailingPathDelimiter(GlobalConf.WebRoot);
    Conn := TSessionConnection.Create(ARequest.RemoteAddr, tok);
    try
      try
        Conn.Connect(GlobalConf.DB);
      except
        On E: Exception do
        begin
          AResponse.Content := 'ERROR: ' + E.Message;
          Exit;
        end;
      end;
      // No rights required
 
      WriteServerStatus(AResponse.Contents);
 
    finally
      Conn.Free;
    end;


TSessionConnection.Connect:

Code: Alles auswählen

 
  inherited Connect(DatabaseInfo);
  // resolve session cookie
  FUID:=CheckToken(FToken);
  // check if valid session, else throw execption
  if FUID = 0 then
    raise EInvalidTokenException.Create('invalid token');
  // get access level
  FMySQLQuery.SQL.Text :='SELECT Access FROM Users WHERE ID = :uid';
  // fill in params
  FMySQLQuery.ParamByName('uid').AsLargeInt := FUID;
  // execute and recieve results
  FMySQLQuery.Open;
  try
    // check if only one was found
    if FMySQLQuery.RecordCount <> 1 then
      raise EThisShouldNeverHappenException.Create('no account found, this should never happen');
    FAccess:=FMySQLQuery.FieldByName('Access').AsInteger;
  finally
    // closing query for reuse
    FMySQLQuery.Close;
    // commit transaction
    FMySQLTransaction.Commit;
  end;


Inherited Connect:

Code: Alles auswählen

  // Setup connection
  with FMySQLConnection do
  begin
    HostName := DatabaseInfo.Hostname;
    UserName := DatabaseInfo.Username;
    Password := DatabaseInfo.Password;
    DatabaseName := DatabaseInfo.Database;
  end;
 
  // Open connection
  FMySQLConnection.Open;
  // throw error if connection is not available
  if not FMySQLConnection.Connected then
    raise EDBConnectionException.Create('Unable to connect to DB');   


Destruktor:

Code: Alles auswählen

 
  FMySQLConnection.Close(true);
  FMySQLConnection.Free;
  FMySQLTransaction.Free;
  FMySQLQuery.Free;
  inherited Destroy; 

Warf
Beiträge: 1907
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: MariaDB und Multithreading?

Beitrag von Warf »

Habe rausgefunden unter Linux funktionierts. Da es am Ende eh auf einem Linux Server laufen wird ist das für mich kein Problem mehr. Für die Entwicklung unter Windows hab ich Threading einfach mal ausgeschaltet.

Antworten