利用单例模式设计数据库连接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/>";
} ?>
$dbconnector1=db::getInstance("localhost","root","root","test");//创建数据库连接类
还是会返回原来的已经创建实例$dbconnector,更应该说操作$dbconnector与$dbconnector1是同样的效果,它们就是同一个东西,不会在服务器的内存上多开辟资源来存放$dbconnector与$dbconnector1,因为db被单例了,从而达到减少数据库压力的目的。
利用单例模式设计数据库连接Model类的更多相关文章
- 单例模式写MySQL model类,简单的增、删、改、查
单例模式的用途,可用于数据库操作 <?php Class Db { static private $whe;//条件 static private $tab;//表名 static privat ...
- 设计模式之PHP项目应用——单例模式设计Memcache和Redis操作类
1 单例模式简单介绍 单例模式是一种经常使用的软件设计模式. 在它的核心结构中仅仅包括一个被称为单例类的特殊类. 通过单例模式能够保证系统中一个类仅仅有一个实例并且该实例易于外界訪问.从而方便对实例个 ...
- J2EE进阶(七)利用SSH框架根据数据表建立model类
J2EE进阶(七)利用SSH框架根据数据表建立model类 前言 在利用SSH框架进行项目开发时,若将数据库已经建好,并且数据表之间的依赖关系已经确定,可以利用Hibernate的反转功能进行mode ...
- DataTable和DataRow利用反射直接转换为Model对象的扩展方法类
DataTable和DataRow利用反射直接转换为Model对象的扩展方法类 /// <summary> /// 类 说 明:给DataTable和DataRow扩展方法,直接转换为 ...
- 利用反射和泛型把Model对象按行储存进数据库以及按行取出然后转换成Model 类实例 MVC网站通用配置项管理
利用反射和泛型把Model对象按行储存进数据库以及按行取出然后转换成Model 类实例 MVC网站通用配置项管理 2018-3-10 15:18 | 发布:Admin | 分类:代码库 | 评论: ...
- java 利用c3p0管理数据库连接池
数据库连接池类,用于获取数据库连接.利用单例模式保证所有的连接都只通过一个连接池管理. package com.mousewheel.dbcon; import java.io.InputStream ...
- PHP用单例模式实现一个数据库类
使用单例模式的出发点: 1.php的应用主要在于数据库应用, 所以一个应用中会存在大量的数据库操作, 使用单例模式, 则可以避免大量的new 操作消耗的资源. 2.如果系统中需要有一个类来全局控制某些 ...
- 构建自己的PHP框架--实现Model类(1)
在之前的博客中,我们定义了ORM的接口,以及决定了使用PDO去实现.最后我们提到会有一个Model类实现ModelInterface接口. 现在我们来实现这个接口,如下: <?php names ...
- 利用MVVM设计快速开发个人中心、设置等模块
我们在做iOS开发过程中,静态页面的开发比开发动态页面更让我们开发者抓狂.因为动态页面通常是一个页面一种cell样式,作为开发者只需要专注于定制好一种样式之后,就可以使用数据填充出较好的界面.而静态c ...
随机推荐
- Go语言封装Http协议GET和POST请求
本文几乎没有文字叙述: /* 有关Http协议GET和POST请求的封装 */ package net import ( "net/http" "io" &qu ...
- Number Sequence(hdu4390)
Number Sequence Time Limit: 10000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tot ...
- 小希的迷宫(hdu1272)并查集(有点坑)
纪念我死去的脑细胞们 ..... 小希的迷宫 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java ...
- Mybatis架构简介
一.Mybatis与ORM 对象关系映射(即Object Relational Mapping,简称ORM),主要用于关系型数据库和实体之间的映射,主要为了解决对象与关系数据库存在的互不匹配的现象,O ...
- Navicat11全系列激活工具和使用方法
Navicat特别好使,但是就是得注册,在网上看到了一个激活工具,成功激活了Navicat...工具链接地址是.. https://files.cnblogs.com/files/miantiaoan ...
- Hadoop Mapreduce 参数 (一)
参考 hadoop权威指南 第六章,6.4节 背景 hadoop,mapreduce就如MVC,spring一样现在已经是烂大街了,虽然用过,但是说看过源码么,没有,调过参数么?调过,调到刚好能跑起来 ...
- wagon-maven-plugin实现自动打包部署到服务器
1.在maven中添加依赖 <!-- https://mvnrepository.com/artifact/org.codehaus.mojo/wagon-maven-plugin --> ...
- <Android 基础(三十一)> ObjectAnimator
简介 ObjectAnimator,是ValueAnimator的子类,支持利用目标视图的属性来实现动画效果.构造ObjectAnimator的时候,将会提取对应的参数来定义动画对象和对象属性.合适的 ...
- SAP FI/CO 基本概念
每一个SAP从业者都对这些概念不陌生,理解透了这些概念,对SAP的业务体系构架才能有明确地认识. 1.集团(client)的概念:是SAP中的最高等级:每一个集团建立主数据库. 2.公司(Compan ...
- VBoxManage翕令
VBoxManage list vms VBoxManage startvm dcsvr08 -type vrdp VBoxHeadless -startvm "dcsvr08" ...