gpt4 book ai didi

performance - DBI 语句句柄可以使用缓存调用来执行()吗?

转载 作者:行者123 更新时间:2023-12-04 03:16:18 24 4
gpt4 key购买 nike

我有一个数据库很少更改的应用程序,并且该应用程序需要从数据库中进行多次读取,这会显着降低性能。其中许多读数完全相同。所以我想让 DBI 缓存数据库读取的结果。

例如,

$sth = $dbh->prepare('SELECT a, b FROM a_table WHERE c = ?');
$sth->execute(5);
$sth->execute(2);
$sth->execute(5); # this call loads the cached result set

我首先以为这是 prepare_cached确实如此,但我意识到它只缓存语句句柄本身,而不是语句句柄的实际执行。

我想我可以通过将语句执行包装在一个 memoized 子中来实现我想要的。但我只是看看 DBI 本身是否有捷径。

最佳答案

如您所说,prepare_cached与语句句柄有关,您需要缓存执行结果。 Memoize 很好,但可能您需要不时使缓存无效,并重新执行查询以从数据库中获取新副本。
我会使用缓存( http://search.cpan.org/perldoc?Cache )模块。我刚刚从介绍中复制了这个片段:

use Cache::File;

my $cache = Cache::File->new( cache_root => '/tmp/cacheroot' );
my $customer = $cache->get( $name );

unless ($customer) {
$customer = get_customer_from_db( $name );
$cache->set( $name, $customer, '10 minutes' );
}

return $customer;

您可以在内存缓存中使用而不是 File。此示例使用缓存中的 $customer 值(如果存在且有效),否则获取新值并存储在缓存中(具有 10 分钟的生命周期)。

希望这可以帮助。

关于performance - DBI 语句句柄可以使用缓存调用来执行()吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7608799/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com