MariaDB und Multithreading?

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.

MariaDB und Multithreading?

Beitragvon Warf » 29. Apr 2018, 16:15 MariaDB und Multithreading?

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: 984
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: Mac OSX 10.11 | Win 10 | FPC 3.0.0 | L trunk | 
CPU-Target: x86_64, i368, ARM
Nach oben

Beitragvon Warf » 29. Apr 2018, 20:27 Re: MariaDB und Multithreading?

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.
Warf
 
Beiträge: 984
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: Mac OSX 10.11 | Win 10 | FPC 3.0.0 | L trunk | 
CPU-Target: x86_64, i368, ARM
Nach oben

• Themenende •

Zurück zu Datenbanken



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste

porpoises-institution
accuracy-worried