[ FranjoZG @ 17.05.2021. 09:26 ] @
Opet se patim sa service app. (Delphi XE 10.1)
Trebalo bi: service "čući" nad Firebird bazom i gleda promjenu na jednoj tablici. Kada se promjena dogodi, pošalje podatke u MySQL na Web-u.
Radi testa, ne pristupam MySQL bazi već sve radim na lokalnoj bazi. U konkeciji koristim user-a Admin tako da niti to ne može biti problem.

Da li service može "hvatati" post event iz FB baze?

Za pristup bazi koristim FireDac kontrole.

U OnExecute sam stavio Sleep tako da program provjerava podatke svakih 5 minuta.

U program sam stavio da upisuje message koji se mogu vidjeti u EventViewer-u.

Pokušao sam na dva načina:
1. U OnExecute pokrećem qry koji selektira potrebne podatke i u kom se izcršava exec upisa u MySQL
2. Kreirao sam zaseban thread koji obavlja posao.

U 1. slučaju service se ne može startati, javlja grešku.

U 2. slučaju, service se starta, thread se pokrene, ali ima problema sa dohvatom podataka iz baze:
- open konekcije ne javlja grešku, provjera kaže da je konekcija otvorena.
- open qry-a ne javlja grešku. Eof = false.
- pristup fieldu, koji (provjereno u bazi, provjeren qry van programa) nije nul već vraća integer (primary key tablice), u programu vraća (AsString) prazan string.
- try ... except ne javlja grešku.

Ako koristim zasebni thread (prema onom što sam našao na Web-u bi trebalo), kuda staviti kreiranje thread-a? U OnExecute, OnCreate ili OnStart?
Koliko sam shvatio, pokretanje thread-a (resume) treba staviti u OnExecute.

Da li se tko bavio service app s pristupom bazi? Imate li ideju gdje griješim i što napraviti?
[ savkic @ 17.05.2021. 22:44 ] @
> Da li service može "hvatati" post event iz FB baze?

Misliš na POST_EVENT komandu iz PSQLa? Trebalo bi, samo je bitno da port preko koga ide ta notifikacija bude slobodan (nije zabranjen u firewallu).

Da li ces da proveru radis poolingom (na x sekundi) ili preko eventsa?

> U OnExecute sam stavio Sleep tako da program provjerava podatke svakih 5 minuta.

OnExecute servisa ili threada? Zvanican savet je da se u OnStart servisa napravi novi thread i da dalje on radi sta treba.
Nemoj koristiti Sleep jer tako blokiras rad servisa/threada, koristi WaitForSingleObject npr.

> Pokušao sam na dva načina:

I OnExecute servisa i threada mora da napravi novu konekciju ka bazi (posebna instanca database, transaction i query komponente).

> pristup fieldu, koji (provjereno u bazi, provjeren qry van programa) nije nul već vraća integer (primary key tablice), u programu
> vraća (AsString) prazan string.

Vidi da li tvoj kod za rad sa bazom funkcionise u obicnom programu (ne servisnom).

> kuda staviti kreiranje thread-a? U OnExecute, OnCreate ili OnStart?

U OnStart.