Hallo,
mein Programm - Abrechnungsprogramm mit Firebird als DB , SQLDB Controls und programmiert in Lazarus, läuft mit 6 Nutzern soweit Ok bis auf ein Phänomen, dem ich nicht auf die Spur komme.
Die Anwender geben Daten ein, suchen in Adressen und erstellen Aufträge aller Art. Zu diesem Zweck ruft man verschiedene Oberflächen (Fenster) auf. Das geht auch eine Zeit lang gut bis
dann eine Konstellation auftritt, die beim Aufruf eines Fensters dann die Anwendung am Client einfriert. Ein erkennbarer Zusammenhang ist, daß ein Anwender im gleichen Programmteil arbeitet, den ein weiter aufrufen will.
Warum das nur manchmal passiert, erschliesst sich mir nicht. Hat es mit dem Aufruf der Fenster zu tun, mit dem Laden der Daten .... Ich habe keinen Schimmer.
Habe die Fenster bisher dynamisch erstellt , modal angezeigt und dann wieder freigegeben. Habe jetzt umgestellt und die Fenster schon bein Programmstart erzeugt. Problem besteht weiterhin.
Auf meinen PC's versuche ich das zu simulieren, habe es bisher aber nicht geschafft. Da läuft alles OK. Meine eigenen Rechner sind WIN 10 Professional PC's, die vom Kunden laufen noch mit XP, obwohl moderne Hardware.
Speicherproblem scheint ausgeschlossen da alle Clients und der Server >=2 GB haben. Ich vermute dass es mit dem Laden der Daten vom Server zu tun hat, wenn ich ein Fenster öffne und die Daten aus
Firebird lade und anzeige. Hat irgendjemand eine Idee oder braucht noch mehr Info ?
Werde die Frage auch noch im Forum bei Datenbanken einstellen.
Jede Idee ist hilfreich.
Lucky
Anwendung friert beim Öffnen eines Fensters ein
-
- Beiträge: 2013
- Registriert: Do 16. Okt 2008, 10:22
- OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
- CPU-Target: x86,x64,ARM
Re: Anwendung friert beim Öffnen eines Fensters ein
Das hat vermutlich weniger mit Formularen sondern mit Transaktionen zu tun. Die 6 Anwender arbeiten doch sicher mit 6 verschiedenen Anwendungsinstanzen? Hast du dich um die "transaction isolation level" gekümmert?
https://www.ibphoenix.com/resources/doc ... to/doc_400
https://www.firebirdsql.org/pdfmanual/h ... tions.html
https://firebirdsql.org/file/documentat ... ments.html
https://www.ibphoenix.com/resources/doc ... to/doc_400
https://www.firebirdsql.org/pdfmanual/h ... tions.html
https://firebirdsql.org/file/documentat ... ments.html
Re: Anwendung friert beim Öffnen eines Fensters ein
Hallo mse,
danke für die schnelle Antwort.
Du hast recht, die Transaktionen sind ein heikles Thema und die 'transaction isolation level' im Besonderen.
Im Programm gibt es ein Hauptfenster , von wo alle Unterfenster aufgerufen werden. Wie gesagt erst dynamisch jetzt statisch.
Jedes Fenster beinhaltet eine eigene Anwendung die wiederun ihrere eigene Transaktion startet. Der 'transaction isolation level' wird auf
'isc_tpb_read_committed ' gesetzt. da das die einzige Variante ist, wo mehrere Anwender parallel arbeiten können.
Sobald ich andere Einstellungen mache wie 'isc_tpb_read_committed,isc_tpb_rec_version,isc_tpb_wait ', kommen viele deadlock Meldungen
oder der Zugriff auf die DB ist für andere gesperrt. Es gibt auch 'try finally' oder 'try except' in den Aufrufen.
Ich denke es ist ein guter Ansatz die Transaktionen noch einmal anzugehen und sie vielleicht kürzer zu machen, d .h sie erst zu öffnen wenn gelesen oder geschrieben wird und sie dann sofort wieder schliessen.
Lucky
danke für die schnelle Antwort.
Du hast recht, die Transaktionen sind ein heikles Thema und die 'transaction isolation level' im Besonderen.
Im Programm gibt es ein Hauptfenster , von wo alle Unterfenster aufgerufen werden. Wie gesagt erst dynamisch jetzt statisch.
Jedes Fenster beinhaltet eine eigene Anwendung die wiederun ihrere eigene Transaktion startet. Der 'transaction isolation level' wird auf
'isc_tpb_read_committed ' gesetzt. da das die einzige Variante ist, wo mehrere Anwender parallel arbeiten können.
Sobald ich andere Einstellungen mache wie 'isc_tpb_read_committed,isc_tpb_rec_version,isc_tpb_wait ', kommen viele deadlock Meldungen
oder der Zugriff auf die DB ist für andere gesperrt. Es gibt auch 'try finally' oder 'try except' in den Aufrufen.
Ich denke es ist ein guter Ansatz die Transaktionen noch einmal anzugehen und sie vielleicht kürzer zu machen, d .h sie erst zu öffnen wenn gelesen oder geschrieben wird und sie dann sofort wieder schliessen.
Lucky
- af0815
- Lazarusforum e. V.
- Beiträge: 6209
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Anwendung friert beim Öffnen eines Fensters ein
luckylynx hat geschrieben:Ich denke es ist ein guter Ansatz die Transaktionen noch einmal anzugehen und sie vielleicht kürzer zu machen, d .h sie erst zu öffnen wenn gelesen oder geschrieben wird und sie dann sofort wieder schliessen.
+1
Nicht nur das die Transaktion wirklich nur dann aktiv sein sollte wen unbedingt gebraucht, auch die Transaktion mit try..finally..end schützen, also entweder comitten oder verwerfen. Nicht das durch eine Exception die Transaktion hängen (offen) bleibt.
Es klingt böd, aber manchmal ist das Autocommit gar nicht so schlecht. (Ist jetzt in der TQuery unter options drinnen). Kann sein das man die noch in der Transaktion einstellen muss. Ich habe aktuell mit SQLDB zu wenig gemacht.
Andreas
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).