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
  • 相关阅读:
    跳出iframe
    leetcode 225. Implement Stack using Queues
    leetcode 206. Reverse Linked List
    leetcode 205. Isomorphic Strings
    leetcode 203. Remove Linked List Elements
    leetcode 198. House Robber
    leetcode 190. Reverse Bits
    leetcode leetcode 783. Minimum Distance Between BST Nodes
    leetcode 202. Happy Number
    leetcode 389. Find the Difference
  • 原文地址:https://www.cnblogs.com/yszr/p/9511079.html
Copyright © 2011-2022 走看看