Results 1 to 8 of 8

Thread: meerdere queries tegelijk uit voeren

  1. #1

    meerdere queries tegelijk uit voeren

    Hallo,

    Van oudsher maakt mijn programma gebruik van een Firebird database (tegenwoordig via FireDac componenten set)
    NBij het opstarten van het programma wordt er een connectie gemaakt met de database.
    Daarna start de gebruiker een taak waarbij data uit de database wordt opgehaald (of wordt weg geschreven) en doet hij/zij alle handelingen verder sequentieel.
    Echter we willen nu ook processen op de achtergrond gaan draaien die ook gebruik gaan maken van de database.
    Dit houdt in dat wanneer je een query uitvoert deze door een automatisch proces overschreven kan worden.

    Mijn huidige database component heeft dus maar 1 Query en 1 Transactie.
    Hoe zorg ik er nu voor dat er meerdere Queries zijn en dat ieder onderdeel in mijn programma zijn eigen queries kan uitvoeren.

    Mijn idee is om een simpel test programma te maken met 2 knopen waarmee je twee verschillende queries (die enige tijd duren) kan starten en waarbij de output in twee dataset op het scherm getoond worden

  2. #2
    Nou je gaat wat uitdagingen krijgen als je dingen op de achtergrond wilt gaan doen. Je zult threads moeten gaan gebruiken of misschien kun je wat dingen doen met de parallels library van Delphi (in feite ook threads).

    Maar je zult ook moeten uitzoeken of je met 1 database connectie query's vanuit threads kunt gebruiken. Volgens mij zitten daar bij veel DAC sets beperkingen op, weet niet hoe dat met Firedac is. Transactie management zal ook wat uitdagender worden, zeker in combinatie met Firebird.

    Bedoel je met je opmerking 1 query component en 1 transactie dat jij in code steeds dezelfde query component vult met een SQL en die dan uitvoert?

    Kun je wat meer aangeven wat je wilt gaan bereiken?

  3. #3
    Quote Originally Posted by cpri View Post
    Mijn huidige database component heeft dus maar 1 Query en 1 Transactie.
    Hoe zorg ik er nu voor dat er meerdere Queries zijn en dat ieder onderdeel in mijn programma zijn eigen queries kan uitvoeren.
    Begin met de database connectie component alleen in de datamodule te zetten. De queries kun je dan individueel op de forms neerzetten. Ik heb nooit begrepen waarom je queries ook in de datamodule zou willen want als je een form meerdere keren aanmaakt, wil je de query zelf op je forminstantie hebben.

    Transactie zou je ook apart per form kunnen doen. Zodat je die ook individueel kunt committen.

    Verder kun je natuurlijk op een forum ook meerdere tsqlquery's op één form plaatsen (naar behoefte).

    Als je met threads gaat werken kom je wel wat complexiteit tegen. De database connecties zijn inderdaad doorgaans niet threadsafe. Dat betekent dat elke thread zijn eigen connectie naar de database zou moeten openen. Maar ik zou pas met threads werken als het ook echt nodig is.

  4. #4
    Ok blijkbaar minder evident dan ik dacht.
    Inmiddels wel een oplossing gevonden.
    De functie heeft als input een sql string en geeft een TFDQuery terug
    Intern maakt de functie een thread aan voor een query en wacht totdat deze is uitgevoerd.
    Wellicht niet de beste oplossing maar werkt wel voor toepassing

    Code:
    function TFireBirdDB.AddQuery(sql: string): TFDQuery;
    var   ThreadedQuery: TQueryThread;
    begin
    ThreadedQuery := TQueryThread.create(nil);
    ThreadedQuery.Query.connection := FDConnection;
    ThreadedQuery.Query.transaction := Transaction;
    ThreadedQuery.sql := sql;
    ThreadedQuery.Start;
    while not ThreadedQuery.Done do
     application.ProcessMessages;
    result := ThreadedQuery.Query;
    end;

  5. #5
    Als je je opzet wilt verbeteren zou ik om te beginnen geen sql meer in code zetten, maar in de query componenten. Daar zijn ze voor bedoeld.

    Maar je hebt ook nog steeds niet aangegeven waarom je dit in threads zou willen doen.

  6. #6
    Silly member NGLN's Avatar
    Join Date
    Aug 2004
    Location
    Werkendam
    Posts
    5,100
    Quote Originally Posted by cpri View Post
    Code:
      ...
      while not ThreadedQuery.Done do
        Application.ProcessMessages;
    Ik weet helaas niets van FireBird/FireDac en TFD...-componenten, maar dit zou absoluut niet nodig hoeven zijn als een en ander doet wat jij beschrijft en wat het beloofd: een query in een thread uitvoeren.

    Quote Originally Posted by Benno View Post
    Maar je hebt ook nog steeds niet aangegeven waarom je dit in threads zou willen doen.
    Wellicht omdat jij dat adviseerde in post #2?

    @cpri: Ik denk wij heel moeilijk advies kunnen geven omdat er gewoon te weinig randvoorwaarden bekend zijn. Bijvoorbeeld: Die achtergrondprocessen, moeten die perse door de client (de instantie die een "gebruiker" heeft opgestart) uitgevoerd worden? Waarom moet dat op de achtergrond? Hoe lang duurt een dergelijke query dan maximaal? Je wilt het resultaat van de achtergrondquery visueel feedbacken in een testprogramma; geldt dat voor het echte programma ook? Zo ja, dan is de gebruiker wellicht eerder geneigd enige wachttijd te dulden, net als bij de andere processen? Etc...
    (Sender as TNLDUser).Signature := 'Groeten van Albert';

  7. #7
    Quote Originally Posted by NGLN View Post
    Ik weet helaas niets van FireBird/FireDac en TFD...-componenten, maar dit zou absoluut niet nodig hoeven zijn als een en ander doet wat jij beschrijft en wat het beloofd: een query in een thread uitvoeren.
    Wel als je iets met het resultaat wilt doen.
    Maar dan haal je ook het hele nut van een thread onderuit.

  8. #8
    Wellicht omdat jij dat adviseerde in post #2?
    en dat kwam weer voort uit zijn achtergrondprocessen in zijn vraag.

    Maar inderdaad is de vraag gewoon te onduidelijk.

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •