`

PHP5用装饰模式和工厂模式构造支持Memory Cache的数据库连接类(转)

 
阅读更多

转自:http://blog.csdn.net/heiyilvzhe/article/details/5979730

 

需求

1. 为数据库连接类读数据增加缓存处理,缓存方式可以为文件、Memory Cache

先只对Memory Cache实现

2. 对现有代码不进行大的改动,方便移植

3. 数据库连接类可扩充其他功能。

 

客户端调用

以前的方法
$result = $db_bbs->query_memcache($sql_str);
if(!$result) {
 $result = $db_bbs->get_results($sql_str);
 }

现在的只要一行$db_bbs->get_results($sql_str)。

如果写个文件缓存类的实现,生成文件缓存也像操作数据库一样都用$db_bbs->get_results($sql_str);
就是说操作memory cache、文件和真正的数据库没区别,对于调用的程序是透明的。
使用装饰模式可以将对memory cache、和文件的操作独立出来。

 

 

 

//----------------------------------------我是分割线-------------------------------------------------

 

 

旧的数据库连接类和支持缓存的连接类都实现以下接口

//存储查询写入接口
interface interface_DB {
    public function get_results($sql, $oMethod = 'A');
    public function query($sql);
    public function get_row($sql , $oMethod = 'A');
    public function get_var($sql);
}

支持不同缓存的连接类可以对get_results等方法进行各自的实现。

 

 

//----------------------------------------我是分割线-------------------------------------------------

 

 

数据库连接类使用工厂模式构造

下面是具体代码

<?php
require_once(DBSTORE."DB_Base.php");
class StoreFactory{
  static function create($db,$classname="") {
        if(!$classname){
            return $db;
        }        
        if (!class_exists($classname)) {
            if(include_once(DBSTORE.$classname.'.php')){
                return new $classname($db);
            }else{
                throw new Exception ($classname .'file not found');
            }
        }

        
    }
}
?>

 

//----------------------------------------我是分割线-------------------------------------------------

 

支持缓存的数据库连接类

构造函数

    public function __construct(DB_Base $db){     #初始化
        $this->MEM_PRE_KEY = $_SERVER['SERVER_NAME'];
        $this->db = $db;
        $this->mem = new Memcache;
        
        foreach ($this->IP as $key=>$value)
        {
            $this->mem->addServer($value,11211,false);
        }
    }

get_results 实现方法

    public function get_results($sql,$oMethod="A"){
        if (preg_match('/(^select)/sim', $sql)) {
            $this->content = $this->get_content($sql);
            if ($this->content){
                $this->content =unserialize($this->content);
            }

            if(!$this->content) {
                $this->content = $this->db->get_results($sql,$oMethod);
                if ($this->content){
                    $this->set_content($sql,serialize($this->content),$this->limit_time);
                }

            }}else{
                $this->get_results_nocache($sql,$oMethod);
            }
            return $this->content;

    }

 

没有缓存或者缓存过期时调用的方法

    protected  function get_results_nocache($sql,$oMethod){
        $this->content = $this->db->get_results($sql,$oMethod);
        return $this->content;
    }

 

 

 

//----------------------------------------我是分割线-------------------------------------------------

 

<?php

define('DBSTORE',"D:/projects/dp/decorator/store/");
require_once(DBSTORE."class_storefactory.php");


$db = StoreFactory::create($DB_localhost,"MemoryStore");
$db->limit_time=10;
$r_old = $DB_localhost->get_results("select phraseid,varname,text from phrase phraseid limit 0,1#yiduo ");
$r = $db->get_results("select phraseid,varname,text from phrase phraseid limit 0,1#yiduo ");

if($r_old==$r) {
 print_r("OK");
}

?>

 

 

 

//----------------------------------------我是分割线-------------------------------------------------

 

利用装饰模式可以为数据库连接类扩展功能

如果你写个数据库日志类DB_LOG

可以这样建一个对象
$db = StoreFactory::create($DB_MemoryStore,"DB_LOG");

那$db 类就有了数据库日志记录功能,同时还有memory cache的功能

数据库日志记录功能本身不和DB_MemoryStore类耦合,DB_MemoryStore类的代码不会特别庞大

分享到:
评论

相关推荐

    c#.net 抽象数据库连接类(适合所有数据库)

    1. **工厂模式**:可以创建一个数据库连接工厂类,根据配置信息动态创建相应数据库的数据提供者实例,这样可以灵活地切换数据库。 2. **依赖注入框架**:结合IoC(Inversion of Control)容器,如Autofac、Unity或...

    memory cache

    【内存缓存(Memory Cache)】在Java的内存管理中,内存缓存是一种优化策略,它的目的是减少对数据库或其他外部资源的访问,从而提高应用程序的性能。内存缓存利用计算机的内存来存储常用数据,使得数据获取速度比...

    浅谈cache memory 王齐.pdf

    在讨论x86架构下的缓存(Cache Memory)时,首先我们需要理解什么是缓存以及它为何重要。缓存是一类快速存储设备,它位于处理器和主存(主内存)之间。缓存的主要功能是存储处理器经常使用的指令和数据。由于CPU执行...

    c#缓存使用工具,也已使用Redis和MemoryCache

    还在测试,这几天完善一下

    Linux Php连接SQLServer数据库

    ### Linux环境下通过PHP连接SQL Server数据库 在Linux环境中利用PHP连接SQL Server数据库是常见的操作需求之一,尤其是在处理跨平台数据库应用时。本文将详细介绍如何在Linux系统上配置环境,以便PHP能够成功连接到...

    Memory System_cache_dram_disk

    本主题将深入探讨三个关键层次的存储器:Cache、DRAM(动态随机存取内存)和磁盘。 首先,Cache是存储器系统中的最快部分,它的主要任务是减少CPU与主存之间的通信延迟。Cache的工作原理基于局部性原理,即程序运行...

    处理器系统中的Cache-Memory

    ### 处理器系统中的Cache-Memory #### 一、Cache的重要性及其作用 在现代处理器系统中,Cache-Memory(通常简称为Cache)扮演着至关重要的角色。它位于内存层次结构的顶端,紧邻处理器核心,其目的是通过缓存最近...

    SQL2008数据库连接的设置

    在SQL Server 2008中,数据库连接的设置是管理和使用数据库系统的关键步骤,它涉及到服务器配置、安全性、网络协议以及客户端连接等多方面。本文将深入探讨这些知识点,帮助用户更好地理解和操作SQL Server 2008的...

    数据库JDBC连接.txt

    H2数据库是一个用Java编写的开源数据库管理系统,具有高性能、支持多种数据库模式的特点,适合用于测试和开发环境。 - **dialect**:指定Hibernate使用的方言类型,对于H2数据库,通常使用`org.hibernate.dialect....

    Memory Systems - Cache, DRAM, Disk

    根据提供的文件信息,我们可以...通过整合这些知识点,我们得到了对《Memory Systems - Cache, DRAM, Disk》一书的全面理解和细致解读,这是一本集技术深度和广度于一体,适用于不同读者层次的计算机内存系统权威著作。

    数据库分类知识.zip

    数据库是信息时代的核心,它负责存储、管理和检索数据,为各种应用提供支持。数据库系统有很多种类型,每种都有其特定的特性和用途。本压缩包文件"数据库分类知识.zip"聚焦于数据库管理,并特别提及了MySQL,这是一...

    Cache Memory相关操作总结

    cache memory, cache line, write through and write back. Average memory access time = Hit time + Miss rate x Miss penalty

    ASP.NET 2010 工厂模式增删改查小实例

    3. 性能优化:考虑使用缓存技术(如Memory Cache)减少数据库访问,或者使用分页、延迟加载等策略提高性能。 4. 安全性:验证用户输入,防止SQL注入等安全问题。 通过这个实例,开发者可以学习到如何在ASP.NET 2010...

    Delphi使用SQLite3内存数据库

    这通常通过创建一个内存中的数据库连接完成,使用SQL语句`ATTACH DATABASE 'memory:' AS mem_db`来实现。这样,所有的数据库操作都会在内存中进行,直到手动断开连接。 4. **内存数据库备份到本地** 内存数据库...

    【ASP.NET编程知识】.NET Core 2.0迁移小技巧之MemoryCache问题修复解决的方法.docx

    但是由于 .NET Core 2.0 暂时不支持 System.Runtime.Caching dll,导致 MemoryCache 相关代码无法使用。 解决方案是使用 .NET Core 2.0 的新 API 实现内存缓存功能,具体步骤如下: 1. 将旧代码导入项目中,并使用...

    局域网连接数据库程序

    5. **错误处理与性能优化**:确保程序能够正确处理连接失败、查询错误等情况,同时考虑并发性能和资源管理,如连接池的使用,避免过多的数据库连接开销。 6. **安全性**:在局域网环境下,必须确保数据的安全性,...

    Cache-Memory-10-03.pdf

    本文主要探讨了缓存内存(Cache Memory)的相关知识,内容涵盖了缓存的基本概念、工作原理、组成结构、替换算法、指令缓存、一致性与一致性问题、层次结构、数据预取等多个方面。由于文件内容是扫描后的文字,可能...

    Memory.Systems.-.Cache,.DRAM,.Disk.rar

    总结来说,"Memory Systems - Cache, DRAM, Disk"这个资源涵盖了存储系统的核心组件,从高速缓存的效率提升到DRAM的内存管理和磁盘的持久化存储,深入探讨了这些技术的原理、优缺点以及它们如何协同工作以支持高效的...

Global site tag (gtag.js) - Google Analytics