Thread Datenbankhandle ins Subs mitgeben oder jedes mal neu instanziieren? (20 answers)
Opened by Andi123 at 2017-08-01 14:09

clms
 2019-01-24 17:29
#189604 #189604
User since
2010-08-29
373 Artikel
BenutzerIn
[default_avatar]
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.

View full thread Datenbankhandle ins Subs mitgeben oder jedes mal neu instanziieren?