Thread Datenbankhandle ins Subs mitgeben oder jedes mal neu instanziieren?
(20 answers)
Opened by Andi123 at 2017-08-01 14:09
Bei mir sind die Prioritäten anders:
1. So wenig wie möglich öffnen und schließen 2. So spät wie möglich öffnen Aber wie schon mehrfach gesagt, das hängt stark von der Anwendung und den Lastprofilen ab. Bei mir (Backend für einen Webserver) ist die Anzahl der parallel offenen Connects unkritisch, da sie ohnehin auf die Anzahl der parallelen Instanzen des Webservers plus max. 2 Admin-Connects begrenzt ist. Deshalb öffne ich die Datenbank einmal und verwende den Handle dann in allen Funktionen die auf die Datenbank zugreifen müssen. Den Handle als Parameter an all diese Funktionen durchzureichen, wäre mir aber zu umständlich. Deshalb verwende ich eine Klasse mit einer statischen Methode, die den geöffneten Handle zurückgibt. Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 package My::DBI; my $dbh_static; # fester Handle my $dbh; # temporärer Pointer, wird nach jedem HTTP-Request gelöscht. sub dbh { $dbh ||= _connected_dbh() } sub _connected_dbh { unless (is_conneced($dbh_static)) { $dbh_static = DBI_>connect(...); # init $dbh_static } return $dbh_static; } Mit My::DBI::dbh() kann ich dann von überall direkt auf den konnektierten Datenbank-Handle zugreifen. Meist mache ich das aber über andere statische Funktionen in my::DBI, die Standardabfragen bereitstellen oder Dinge wie Cachen von prepared Statements übernehmen. |