* * * *
13 Visitatori, 0 Utenti

Autore Topic: db e thread  (Letto 734 volte)

Diego1981

  • Full Member
  • ***
  • Post: 147
  • Karma: +0/-0
db e thread
« il: 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

xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 2168
  • Karma: +6/-0
Re:db e thread
« Risposta #1 il: 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.
Ieri è passato, domani è futuro, oggi è un dono...

Diego1981

  • Full Member
  • ***
  • Post: 147
  • Karma: +0/-0
Re:db e thread
« Risposta #2 il: 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

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 1494
  • Karma: +2/-0
Re:db e thread
« Risposta #3 il: Marzo 08, 2017, 03:37:05 pm »
Domanda sciocca forse.
Apri una connessione nuova a mysql o ricicli la vecchia?

Stilgar
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

Diego1981

  • Full Member
  • ***
  • Post: 147
  • Karma: +0/-0
Re:db e thread
« Risposta #4 il: Marzo 08, 2017, 04:23:02 pm »
la zconnection è sempre la stessa ed è nel datamodule quindi rimane sempre connesso

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 1494
  • Karma: +2/-0
Re:db e thread
« Risposta #5 il: 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
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

Diego1981

  • Full Member
  • ***
  • Post: 147
  • Karma: +0/-0
Re:db e thread
« Risposta #6 il: 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??
« Ultima modifica: Marzo 09, 2017, 02:13:20 pm da Diego1981 »

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 1494
  • Karma: +2/-0
Re:db e thread
« Risposta #7 il: Marzo 10, 2017, 09:57:26 am »
Come prova
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

Diego1981

  • Full Member
  • ***
  • Post: 147
  • Karma: +0/-0
Re:db e thread
« Risposta #8 il: 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

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 1494
  • Karma: +2/-0
Re:db e thread
« Risposta #9 il: Marzo 13, 2017, 09:53:37 am »
Per pulizia sarebbe meglio altra discussione 😊
Ora sono curioso. È possibile vedere il codice?
Stilgar
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

Diego1981

  • Full Member
  • ***
  • Post: 147
  • Karma: +0/-0
Re:db e thread
« Risposta #10 il: 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

« Ultima modifica: Marzo 13, 2017, 11:08:35 am da Diego1981 »

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 1494
  • Karma: +2/-0
Re:db e thread
« Risposta #11 il: 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.
:)
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

Diego1981

  • Full Member
  • ***
  • Post: 147
  • Karma: +0/-0
Re:db e thread
« Risposta #12 il: 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.

 

Recenti

How To

Trascinare un file nel programma da xinyiman
DB concetti fondamentali e ZeosLib da xinyiman
Recuperare codice HTML da pagina web da xinyiman
Mandare mail con Lazarus da xinyiman
Stabilire il sistema operativo da xinyiman
Esempio lista in pascal da xinyiman
File INI da xinyiman
Codice di attivazione da xinyiman
Realizzare programmi multilingua da xinyiman
Lavorare con le directory da xinyiman
Utilizzare Unità esterne da Loryea
TTreeView da xinyiman
TTreeview e Menu da xinyiman
Generare controlli RUN-TIME da xinyiman
LazReport, PDF ed immagini da xinyiman
Intercettare tasti premuti da xinyiman
Ampliare Lazarus da xinyiman
Lazarus e la crittografia da xinyiman
System Tray con Lazarus da xinyiman
UIB: Unified Interbase da Microges2000
Il file: questo sconosciuto da Microges2000
Conferma di chiusura di un applicazione da xinyiman
Liste e puntatori da Microges2000
Overload di funzioni da Microges2000
Funzioni a parametri variabili da Microges2000
Proprietà da Microges2000
Conversione numerica da Microges2000
TImage su Form e Panel da Maverich
Indy gestiore server FTP lato Client da Maverich
PopUpMenu sotto Pulsante (TSpeedButton) da Maverich
Direttiva $macro da Microges2000
Toolbar da xinyiman
Evidenziare voci TreeView da Maverich
Visualizzare un file Html esterno da Maverich
StatusBar - aggirare l'errore variabile duplicata da Maverich
Da DataSource a Excel da xinyiman
Le permutazioni da xinyiman
Brute force da xinyiman
Indy 10 - Invio email con allegati da Maverich
La gestione degli errori in Lazarus da xinyiman
Pascal Script da xinyiman
Linux + Zeos + Firebird da xinyiman
Dataset virtuale da xinyiman
Overload di operatori da Microges2000
Lavorare con file in formato JSON con Lazarus da nomorelogic
Zeos ... dietro le quinte (prima parte) da Stilgar
Disporre le finestre in un blocco unico (come Delphi) da Maverich
Aspetto retrò (Cmd Line) da xinyiman
Come interfacciare periferica twain da Narciso
Ubuntu - aggiornare free pascal e lazarus da xinyiman
fpcup: installazioni parallele di lazarus e fpc da nomorelogic
Free Pascal e Lazarus sul Raspberry Pi da nomorelogic
Cifratura: breve guida all'uso dell'algoritmo BlowFish con lazarus e free pascal. da nomorelogic
Creare un server multithread da xinyiman
guida all'installazione di fpc trunk da subversion in linux gentoo da nomorelogic
Indice da nomorelogic
DB concetti fondamentali e connessioni standard da xinyiman
Advanced Record Syntax da nomorelogic
DB concetti fondamentali e DBGrid da xinyiman
DB concetti fondamentali e TDBEdit, TDBMemo e TDBText da xinyiman
Advanced Record Syntax: un esempio pratico da nomorelogic
Superclasse form base per programmi gestionali (e non) da nomorelogic
Superclasse form base per programmi gestionali (e non) #2 - log, exception call stack, application toolbox da nomorelogic
Superclasse form base per programmi gestionali (e non) #3 - traduzione delle form da nomorelogic
Superclasse form base per programmi gestionali (e non) #4 - wait animation da nomorelogic
Un dialog per la connessione al database:TfmSimpleDbConnectionDialog da nomorelogic
Installare lazarus su mac osx sierra da xinyiman
Utenti
  • Utenti in totale: 537
  • Latest: mumba71
Stats
  • Post in totale: 10403
  • Topic in totale: 1323
  • Online Today: 23
  • Online Ever: 74
  • (Luglio 09, 2012, 11:05:53 am)
Utenti Online
Users: 0
Guests: 13
Total: 13

Disclaimer:

Questo blog non rappresenta una testata giornalistica poiché viene aggiornato senza alcuna periodicità. Non può pertanto considerarsi un prodotto editoriale ai sensi della legge n. 62/2001.