听老歌 发表于 2011-04-29 13:32

数据库单件模式

数据库单件模式


单例模式:通俗点讲,就是某个类只产生一个实例,无论你在哪个地方用,他们都是一个东西,不熟悉oop的可以联想成指针[虽然不太确切]。

一、基本上是这样的
为了节省数据库连接资源,我们经常在数据库连接类中使用这个模式。基本代码如下:<?php

class db

{

      private static $instance=false;

      public static function instance($host,$name,$pass,$dbname)

      {

                if(self::$instance===false)

                {

                        self::$instance=new db(......);

                }

                return self::$instance;

      }



      private function __construct()

      {

                /*这个函数必须是私有的,它保证了只能通过单例生成器来获得实例*/

      }



      public function __clone()

      {

                /*什么也不做*/

      }

}

?>复制代码

好了现在我们无论在哪个文件里使用
$db=db::instance(......);
的时候都会使用一个统一的数据库连接,而不会重新打开一个新连接了,这样有利用节省资源

二、对不起,有时候我们是好几台服务器
这个时候你只需要修改一下instance函数就行了,   private static $instance=array();

      public static function instance($host,$name,$pass,$dbname)

      {

                $hash=$host.$name.$pass.$dbname;

                if(!isset(self::$instance[$hash]) || self::instance[$hash]===false )

                {

                        self::$instance[$hash]=new db(......);

                }

                return self::$instance;

      }复制代码

大体的意思就是上面这样的了,不过最好想一下不要参数的传递方式,实际应用中最好用数组来统一管理这些数据,每次传四个变量太痛苦了。

三、小气鬼的设置
我在我程序里这么用的,这台电脑上没有代码,就不上代码了,就是对这个实例我先pre_connect赋上数据库联接信息,当我query的时候我才去真正连接[如果没连接的话,这里包括设置编码,选择数据库等初始化操作]
这样我们在程序入口定义好信息,在第一次真正操作连接数据库前能让数据库休息着

最后,单例模式在序列化和反序列化的时候会出现一些问题,大家可以去看laruence大牛的两篇文章
Serialize/Unserialize破坏单例
http://www.laruence.com/2011/03/18/1909.html
可序列化单例模式的遗留问题答案
http://www.laruence.com/2011/03/18/1916.html
页: [1]
查看完整版本: 数据库单件模式