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;
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;
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');
Code: Alles auswählen
FMySQLConnection.Close(true);
FMySQLConnection.Free;
FMySQLTransaction.Free;
FMySQLQuery.Free;
inherited Destroy;