* * * *

Privacy Policy

Blog italiano

Clicca qui se vuoi andare al blog italiano su Lazarus e il pascal.

Forum ufficiale

Se non siete riusciti a reperire l'informazione che cercavate nei nostri articoli o sul nostro forum vi consiglio di visitare il
Forum ufficiale di Lazarus in lingua inglese.

Lazarus 1.0

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

Inserisci il nome utente, la password e la durata della sessione.

398 Visitatori, 0 Utenti

Autore Topic: db e thread  (Letto 6601 volte)

Diego1981

  • Full Member
  • ***
  • Post: 180
  • 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: 3249
  • Karma: +12/-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: 180
  • 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: 2382
  • Karma: +10/-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: 180
  • 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: 2382
  • Karma: +10/-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: 180
  • 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: 2382
  • Karma: +10/-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: 180
  • 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: 2382
  • Karma: +10/-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: 180
  • 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: 2382
  • Karma: +10/-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: 180
  • 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

Utenti
  • Utenti in totale: 785
  • Latest: gmax
Stats
  • Post in totale: 18772
  • Topic in totale: 2233
  • Online Today: 578
  • Online Ever: 900
  • (Gennaio 21, 2020, 08:17:49 pm)
Utenti Online
Users: 0
Guests: 398
Total: 398

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.