Mit PostgreSQL und DBI sowie DBD::Pg ist es möglich, SQL-Queries im Hintergrund asynchron laufen zu lassen – und währenddessen in Perl weitere Berechnungen anzustellen, anstatt nur auf die Daten zu warten. Insbesondere bei Multi-Core-CPUs oder einer Trennung von Datenbankserver und Anwendung ist dies eine sehr praktische Sache.
Und einfach ist es obendrein!
Bei dem jeweiligen Aufruf von $dbh->do, $dbh->prepare oder $dbh->prepare_cached muss nur das Attribut PG_ASYNC hinzugefügt werden. Besonders praktisch ist das bei INSERT und UPDATE Queries, wenn also keine Rückgabewerte ausgewertet werden müssen, da kann man im neuen Query einfach noch auf den Rest des alten warten:
use DBD::Pg qw(:async); # Async-Konstanten einbinden # ... und später Query vorbereiten: my $sth = $self->dbh->prepare( "INSERT INTO table ...", { pg_async => PG_ASYNC + PG_OLDQUERY_WAIT } ); # ... und dann zum Beispiel in einer Schleife aufrufen while ( my @parameter = calculate_next_insert() ) { $sth->execute( @parameter ); } # ...
Wenn man also zwischen mehreren INSERT-Statements noch Eingabedaten berechnen muss, kann dies Zeit sparen. Vor weiteren Queries oder dem Commit sollte man dann noch mit $dbh->pg_result() auf das Ergebnis des letzten asynchronen Queries warten.
Mehr Beispiele und die Darstellung aller Features gibt es in der DBD::Pg Dokumentation.
Aktuelle Kommentare