Results 1 to 5 of 5

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.

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
  •