1
2
3
4
5
6
7
8
9
10
11
12
13
14
[
{
id_db1 => 1
data => foo,
}
{
id_db1 => 2
data => bar,
}
{
id_db1 => 1
data => baz,
}
]
1 2 3 4 5 6
my $sth = $cached{ $sql }; unless ($sth) { $sth = $dbh->prepare($sql); # ggfs. $sth->finish } $cached{ $sql } = $sth;
1 2 3 4 5 6 7 8 9
$STH = $DBH->prepare_cached("SELECT x from y WHERE z=?"); $STH->execute('33'); $STH->fetch...; # Abfrage erst an Cache, dann DB $STH = $DBH->prepare("SELECT x from y WHERE z=?"); $STH->execute('33'); $STH->fetch...; # Abfrage ohne Umschweife an DB
2012-05-09T18:17:55 pqprepare_cached cacht keine resultate. das macht ggfs. die datenbank.
1 2 3 4 5 6 7 8 9 10
my $DBH = dbh() or die $@; my $STH = undef; $STH = $DBH->prepare_cached("SELECT file from perlbase WHERE id=?") or die $@; $STH->execute(33) or die $@; $STH->fetchrow_hashref; $STH->execute(33); sleep 10; # in dieser Zeit stoppte ich den mysql Server print Dumper $STH->fetchrow_hashref; # Ergebnis kommt!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ perl -wE'
use DBI;
my $dbh = DBI->connect(...);
$dbh->do("set wait_timeout=5");
my $sth = $dbh->prepare_cached("SELECT COUNT(*) FROM ...");
$sth->execute or die $dbh->errstr;
say $sth->fetchrow_array;
sleep 6;
$sth->execute or die $dbh->errstr;
say $sth->fetchrow_array;
'
0
DBD::mysql::st execute failed: MySQL server has gone away at -e line 9.
MySQL server has gone away at -e line 9.
2012-05-11T17:00:13 murphyZum Cachen von Funktionsrückgabewerten würde ich ja Memoize empfehlen.
2012-05-11T16:17:49 rostiDas eigentliche Problem ist das Cachen. Ich habe es jetzt so gelöst und gebe diesen Tipp gerne weiter ;)
http://rolfrost.de/map/perlbase/fcache.html
2012-06-06T02:43:07 reneeFür diesen Zweck gibt es schon seit langem Memoize.
Edith sagt, dass murphy schon vorher auf das Modul hingewiesen hat und renee erstmal alles lesen sollte ;-)
2012-06-06T16:31:18 rostiEs ist so, dass es beim Kunden vor Ort sehr unterschiedliche Perl-Umgebungen gibt und das Vorhandensein bestimmter Module nicht immer vorausgesetzt werden kann.