Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: Diego1981 - Marzo 08, 2017, 11:00:41 am

Titolo: db e thread
Inserito 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
Titolo: Re:db e thread
Inserito da: xinyiman - Marzo 08, 2017, 11:06:43 am
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.
Titolo: Re:db e thread
Inserito da: Diego1981 - Marzo 08, 2017, 12:37:19 pm
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
Titolo: Re:db e thread
Inserito da: Stilgar - Marzo 08, 2017, 03:37:05 pm
Domanda sciocca forse.
Apri una connessione nuova a mysql o ricicli la vecchia?

Stilgar
Titolo: Re:db e thread
Inserito da: Diego1981 - Marzo 08, 2017, 04:23:02 pm
la zconnection è sempre la stessa ed è nel datamodule quindi rimane sempre connesso
Titolo: Re:db e thread
Inserito da: Stilgar - Marzo 09, 2017, 12:27:31 am
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
Titolo: Re:db e thread
Inserito da: Diego1981 - Marzo 09, 2017, 01:05:19 pm
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??
Titolo: Re:db e thread
Inserito da: Stilgar - Marzo 10, 2017, 09:57:26 am
Come prova
Titolo: Re:db e thread
Inserito da: Diego1981 - Marzo 12, 2017, 11:05:35 am
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
Titolo: Re:db e thread
Inserito da: Stilgar - Marzo 13, 2017, 09:53:37 am
Per pulizia sarebbe meglio altra discussione 😊
Ora sono curioso. È possibile vedere il codice?
Stilgar
Titolo: Re:db e thread
Inserito da: Diego1981 - Marzo 13, 2017, 11:01:44 am
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

Titolo: Re:db e thread
Inserito da: Stilgar - Marzo 13, 2017, 09:40:57 pm
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.
:)
Titolo: Re:db e thread
Inserito da: Diego1981 - Marzo 14, 2017, 07:55:05 am
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.