Italian community of Lazarus and Free Pascal
Programmazione => Generale => Topic aperto da: Diego1981 - Marzo 08, 2017, 11:00:41 am
-
Ciao Ragazzi
giusto per riprendere il discorso sui tread ;D,
anzichè usare undy sto usando synapse con cui mi trovo sicuramente meglio,ho sicuramente meno problemi e sto provando a creare una specie di webserver.
Utilizzo zeos per accedere a Mysql (Zconnection, Ztable e Zquery sono in un datamodule che viene creato all'avvio del programma)
Ogni thread utlizza i componenti di questo datamodule che quindi , se ho ben capito, non dovrebbero "intrecciarsi" tra loro.
Il problema è che quando lancio una piccola batteria di client (come aveva suggerito SB) i thread creati non danno problemi ma mysql o zeos si
gli errori ricevuti in ordine cronologico sono :
1 EZSQLException - SQL Error: Lost connection to MySQL server during query
2 EZSQLException - SQL Error: MySQL server has gone away
Ho dato anche un'occhiata su dei thread qui nel forum in merito a zeos oltre che sul sito ufficiale ma stento a capire.
suggerimenti??
grazie
Diego
-
Il secondo errore dovrebbe essere legato ad un timeout di mysql che mi sembra laddove si superino le 8 ore di inattività butta giù la connessione al client (che nel tuo caso è il tuo programmino server) e quindi ti genera quel problema. Io in passato ho risolto con un timer ogni 5 minuti in cui rifà una reconnect.
-
Ciao Xiny
ho verificato anche quello e nel file my.ini di Mysql l'ho settato a 86400 anche se ogni volta che avvio il server (per il debug) il timer riparte e quindi non dovrebbe essere il problema legato all'inattività
Probabilmente il 2 è una conseguenza del primo
-
Domanda sciocca forse.
Apri una connessione nuova a mysql o ricicli la vecchia?
Stilgar
-
la zconnection è sempre la stessa ed è nel datamodule quindi rimane sempre connesso
-
Prova ad aprire una nuova connessione per ogni thread.
O gestire un pool di connessioni.
Ne apri una decina (o anche meno tanto è una prova). Le passi ai consumer di volta in volta. Così ti gestisci le connessioni e non massacri il socket del db.
Più che altro è quella "lost connection" che mi da da pensare
-
Ciao Stilgar
dici quindi di non usare il datamodule e creare una zconnection a runtime per ogni tread con le rispettive query e tabelle create anch'esse a runtime??
-
Come prova
-
Ciao Stilgar
ho provato come dicevi tu ma i risultati erano all'incirca gli stessi.
Mentre provavo però ho avuto un'illuminazione ;D
ho usato un puntatore al datamodule creandolo assieme al thread (poi distruggendolo con la distruzione del thread ovviamente) e sembra non avere piu problemi di quel tipo.
quindi grazie.
Posso sfruttare l'occasione per chiederti una cosa sui soket o è meglio aprire un'altra discussione?
Grazie
Diego
-
Per pulizia sarebbe meglio altra discussione 😊
Ora sono curioso. È possibile vedere il codice?
Stilgar
-
se ti riferisci al codice inerente alla discussione:
uses
Classes, SysUtils,blcksock, winsock, synautil, Forms, strutils, synacode, dateutils,
udatamodule;
TClientThrd = class(TThread)
private
....
DM:TDM_Ordini;(nome del datamodule)
....
....
public
Constructor Create(hsock:TSocket);
Destructor Destroy; override;
procedure Execute; override;
end;
constructor TClientThrd.Create(hsock: TSocket);
begin
DM:=TDM_Ordini.Create(Nil);
....
....
inherited create(false);
end;
procedure TClientThrd.Execute;
begin
....
....
....
end;
destructor TClientThrd.Destroy;
begin
DM.Free;
....
....
inherited Destroy;
end;
(i parametri di connessione al db sono settati dentro la unit del datamodule)
che dici? cosi sembra non avere problemi
per quanto riguarda il socket, sto usando synapse ed ho usato l'esempio HTTPServer ma ogni tanto mi torna indietro (dal client e quindi dal browser) un socket vuoto (a cui però viene assegnato il numero 4294967295) che non riesco proprio a gestire e si blocca tutto (il programma non mi da errori e non va in crash ma di fatto non va nulla)
ti ho anticipato la domanda
grazie
-
Ciao.
Di fatto mi sembra che il codice stia aprendo una nuova connessione ogni volta (dovrei vedere il TDM_Ordini per capirlo).
Per il socket attendo discussione.
:)
-
hai ragione, concettualmente non dovrebbe esserci differenza tra creare una connessione e rispettive query ogni volta (per ogni thread) e puntare al datamodule ma in realtà le differenze ci sono, inoltre ho guardato una discussione sul forum ufficiale zeos che diceva di fare come ho fatto io (almeno se ho ben capito) per evitare ogni problema.
Di certo il vattaggio di creare un datamodule è quello di scrivere meno codice.