首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DBI语句句柄可以使用缓存的调用来执行()吗?

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

Stack Overflow用户
提问于 2011-09-30 18:01:58
回答 1查看 336关注 0票数 6

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

例如,

代码语言:javascript
复制
$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所做的,但我意识到它只缓存语句句柄本身,而不是语句句柄的实际执行。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-09-30 19:07:27

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

代码语言:javascript
复制
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;

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

希望这能有所帮助。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7608799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档