AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

DB-Abfragen in Thread - dann joinen

Ein Thema von hschmid67 · begonnen am 28. Sep 2019 · letzter Beitrag vom 29. Sep 2019
Antwort Antwort
hschmid67

Registriert seit: 2. Jul 2012
Ort: Weilheim i. Obb.
75 Beiträge
 
Delphi 12 Athens
 
#1

AW: DB-Abfragen in Thread - dann joinen

  Alt 28. Sep 2019, 15:13
Hallo K-H,

entschuldige, hab mich wohl etwas kompliziert ausgedrückt:

Ich möchte Daten aus verschiedenen Datenbanken abfragen, also 2, 3, 4 Queries und diese dann miteinander verknüpfen, also dann mit einem Join verbinden also etwa

Code:
SELECT
  q1.feld_a,
  q2.feld_b,
  q3.feld_c
FROM
  db1.tabelle1 q1
  LEFT JOIN db2.tabelle2 q2
  LEFT JOIN db3.tabelle3 q3
Und da ich q1 z.B. lokal liegen hab, sind diese Daten sehr schnell verfügbar, q2 kommt aus einem entfernten MSSQL-Server und q3 vielleicht auch noch aus einem REST-Aufruf, dessen Ergebnis ich zum TDataset mache.

Vielleicht noch eine Ergänzung:

Mit TVirtualQuery (ist bei UniDAC von Devart dabei) kann man Abfragen aus verschiedenen Datasets erzeugen. Daher würde das Ganze dann zwar zuletzt in einer Abfrage stattfinden, zunächst aber kommen die db1.tabelle1, db2.tabelle2 und db3.tabelle3 aus jeweils einem eigenen Tquery-Objekt, sind also drei getrennte DB-Aufrufe, die dann in einem TVirtualQuery verbunden werden.

Wie gesagt, das funktioniert ohne Threads sehr gut, nur eben langsam und mit langer Wartezeit...

Viele Grüße
Harald
Harald Schmid

Geändert von hschmid67 (28. Sep 2019 um 15:24 Uhr)
  Mit Zitat antworten Zitat
hschmid67

Registriert seit: 2. Jul 2012
Ort: Weilheim i. Obb.
75 Beiträge
 
Delphi 12 Athens
 
#2

AW: DB-Abfragen in Thread - dann joinen

  Alt 28. Sep 2019, 15:28
Vielleicht kann man meine Frage auf den einfachen Punkt bringen:

Darf man eine DB-Connection und eine Query, die auf einem Form (oder einem Datenmodul) liegen, in einem Thread verwenden und ausführen und dann das Ergebnis mit einer VCL-Komponente auf dem Form verbinden - oder geht das irgendwann schief?

Viele Grüße
Harald
Harald Schmid
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#3

AW: DB-Abfragen in Thread - dann joinen

  Alt 28. Sep 2019, 20:26
Einfache Antwort, ja das geht.
Wichtig ist nur, das der "DB-Thread" vollkommen eigenständig ist und der Zugriff von der Oberfläche auf das Ergebnis erst erfolgt, wenn der Thread beendet ist, bzw. von Seiten des Threads kein Zugriff mehr erfolgt.
(Ich halte wenig von Synchronize!)
Leider kann ich Dir nicht sagen wie das mit Deiner Version zu realisieren ist, ich hab nur Erfahrung mit TThread.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
hschmid67

Registriert seit: 2. Jul 2012
Ort: Weilheim i. Obb.
75 Beiträge
 
Delphi 12 Athens
 
#4

AW: DB-Abfragen in Thread - dann joinen

  Alt 29. Sep 2019, 12:55
Hallo K-H,

vielen Dank für die Info - dann werde ich das mal so machen...

Viele Grüße und noch einen sonnigen Sonntag
Harald
Harald Schmid
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.688 Beiträge
 
Delphi 2007 Enterprise
 
#5

AW: DB-Abfragen in Thread - dann joinen

  Alt 29. Sep 2019, 21:35
Vielleicht kann man meine Frage auf den einfachen Punkt bringen:

Darf man eine DB-Connection und eine Query, die auf einem Form (oder einem Datenmodul) liegen, in einem Thread verwenden und ausführen und dann das Ergebnis mit einer VCL-Komponente auf dem Form verbinden - oder geht das irgendwann schief?
Zumindest bei MySQL/MariaDB mittels UniDAC bzw. MyDAC bin ich damit schon auf die Nase gefallen. Es geht im Prinzip, und kann auch oft und lange gut gehen, aber wenn es dann auf einmal rummst hat man den Salat. Ich meine irgendwo in der Doku auch mal gelesen zu haben, dass man eine Connection immer nur im selben Thread-Kontext benutzen darf, in dem sie auch erstellt wurde. Seit ich dies mache, habe ich keine Probleme mehr.

Zur Anzeige lohnt es sich dann, eine separate Datenhaltung zu machen, die das Gesamtergenis zugewiesen bekommt. Soll dies auch häppchenweise gehen, müssen alle Zugriffe von in dem Thread (schreibend) und dem Mainthread (lesend) durch Critical Sections abgesichert werden. (Tut man dies nicht, hat man wieder eine ähnliche Situation: Kann lange gut gehen, und dann irgendwann mal nicht und man kratzt sich am Kopf.)

Kleiner Hinweis auf etwas was ich auch erst schmerzlich lernen musste: Wenn du eine Connection im Konstruktor deiner Thread-Klasse erstellst, ist dies noch immer im Kontext des VCL-Threads! Du musst dies in der Execute-Methode machen!
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:51 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz