zoukankan      html  css  js  c++  java
  • 利用单例模式设计数据库连接Model类

    之前在《【php】利用php的构造函数与析构函数编写Mysql数据库查询类》(点击打开链接)写过的Mysql数据库查询类还不够完美,利用《【Java】单例模式》(点击打开链接)介绍的思想可以将这个数据库链接类搞成单例,不会因为多个用户访问网站就创建一个数据库查询实例,拖慢整个网站的速度,让网站的数据库压力比较大,造成网站的速度下降得很厉害。

    单例实现最关键的,还是那3点:

    1、私有构造函数,这里无须像Java那样私有无参数的构造函数,php不允许有多个构造函数——即使这些构造函数参数不同也不可以。

    2、私有克隆类的函数

    3、暴露一个公有的“创造实例函数”供调用,这个“创造实例函数”判断如果已存在相应实例,返回此实例,没有才创建。

    这样保证此数据库连接类有且只有一个。

    直接用一个例子说明,数据库test中有表user

    先利用利用单例模式设计数据库连接Model类,将这张表的内容查询到网页上:

    具体代码如下:

    <?php
    class db{
        private $link;
    
        //db类单例开始
        
        //保存类实例的私有静态成员变量
        private static $_instance;
    
        //定义一个私有的构造函数,确保单例类不能通过new关键字实例化,只能被其自身实例化
        private function __construct($host,$username,$password,$database){
    
            $this->link=mysql_connect($host,$username,$password);
            if(!$this->link){
                die("连接失败!");
            }
            mysql_query("set names utf8;");
            mysql_select_db($database);
        }
    
        //定义私有的__clone()方法,确保单例类不能被复制或克隆
        private function __clone(){}
    
        public static function getInstance($host, $username, $password,$database) {
    
            //检测类是否被实例化
            if(!(self::$_instance instanceof self)){
                self::$_instance=new db($host,$username,$password,$database);
            }
            return self::$_instance;
        }
    
        //执行SQL语句
        public function query($query){
            return mysql_query($query, $this->link);
        }
    
        //关闭数据库连接
        public function close(){
            return mysql_close($this->link);
        }
    
    }
    
    
    //调用单例类测试部分
    header("Content-type: text/html; charset=utf-8"); //设置网页编码
    
    $dbconnector=db::getInstance("localhost","root","root","test");//创建数据库连接类
    
    $result=$dbconnector->query("select * from user");//查询数据库
    
    for($i=0;$row=mysql_fetch_array($result);$i++){//打印查询结果
        echo $row['id'].",".$row['username'].",".$row['password']."<br/>";
    }  
    
    ?>
    这样保证了class db所对应的实例$dbconnector有且只有一个,再有一句:
    $dbconnector1=db::getInstance("localhost","root","root","test");//创建数据库连接类

    还是会返回原来的已经创建实例$dbconnector,更应该说操作$dbconnector与$dbconnector1是同样的效果,它们就是同一个东西,不会在服务器的内存上多开辟资源来存放$dbconnector与$dbconnector1,因为db被单例了,从而达到减少数据库压力的目的。
    版权声明:本文为博主原创文章,未经博主允许,欢迎随意转载,标好作者+原文地址就可以了!感谢欣赏!觉得好请回个贴! https://blog.csdn.net/yongh701/article/details/49182891
  • 相关阅读:
    C语言截取从某位置开始指定长度子字符串方法
    vim:放弃hjkl
    vim资源
    PHP和.NET通用的加密解密函数类,均使用3DES加解密 .
    Java与.NET DES加密解密互转
    案例:使用正则表达式的爬虫
    爬虫的正则表达式re模块
    爬虫中Requests模块
    Oracle系列十一 数据处理
    爬虫urllib2 的异常错误处理URLError和HTTPError
  • 原文地址:https://www.cnblogs.com/yszr/p/9511079.html
Copyright © 2011-2022 走看看