zend-framework – 我应该在Zend_Db中实现缓存?

我想在Zend_Db中实现一个缓存,没有任何本机方法可以为Zend_Db提供缓存,所以我想知道我应该在哪里做.

我看了Zend_Db_Table_Abstract(我在自定义的App_Model_DbTable_Abstract中扩展它),我找到了一个受保护的方法_fetch(),它直接接受Zend_Db_Table_Select实例,看起来像是适配器之前的最后一步.

我正在考虑覆盖这个方法,序列化$select对象,哈希它,最后缓存它,并检查提供的每个$select对象以返回缓存或最新的行集.

这是一种正确的方法吗?

这就是我刚刚做的:

class App_Model_DbTable_Abstract extends Zend_Db_Table_Abstract
{
    protected function _fetch(Zend_Db_Table_Select $select)
    {
        $hashedQuery = sha1(serialize($select->__toString()));
        $cacheManager = Zend_Registry::get('Zend_Cache_Manager');
        $cache = $cacheManager->getCache('database');
        if (!($data = $cache->load($hashedQuery))) {
            $data = parent::_fetch($select);
            $cache->save($data, $hashedQuery);
        }
        return $data;
    }
}
最佳答案
据我所知,zf create db-table< name>将始终创建一个继承Zend_Db_Table_Abstract的类,这将使您的提案难以管理.

此外,你正在耦合缓存和ZF的数据库模块因此可以说在dbtable范围内放置缓存机制是不对的.例如:您不应该知道从哪里获取数据但仍然能够缓存它,因此该过程变为:

>检查数据的缓存,如果找到则提供
>从X获取数据(可以是dbtable,也可以是服务,XML文件,一些JSON等)
>将数据保存在缓存中并提供数据

因此,虽然您的解决方案现在有意义,因为您只使用dbtable模型,但它可以放在更适合的层中.我会查看http://www.slideshare.net/weierophinney/playdoh-modelling-your-objects-1766001(在幻灯片#35附近)以获得实用的解决方案.

简介:dbtable模块和与之相关的代码应始终使用db.

转载注明原文:zend-framework – 我应该在Zend_Db中实现缓存? - 代码日志