各位前辈,
小弟目前在搭建一个web服务,其中需要访问数据库,mysql,那么问题来了,在web服务响应代码中建立与服务器的连接,是将该连接作为全局变量好,还是每次在访问数据库的时候,重现建立连接好呢?
1、前者,将对数据库的连接作为全局变量的好处是每次访问数据库之前,连接已经建立,甚至是可以预先初始化了游标,节约了时间,但是如果在数据库连接超时之内无访问,那么连接失效,就需要进行异常处理;不知道还有没有其它潜在的问题,请各位前辈明示呀。
2、后者,每次访问数据库的时候,都重现建立与数据库的连接,该种情况就是会在响应web服务请求的时候增加了建立连接的时间
请各位前辈指点迷津呀,谢谢呀!
两证方法都一样,因为底层连接时连接池实现的,每次打开关闭其实底层并不是每次都建立连接。
第二种方法肯定是不可取的 至于第一种方法 我来帮你分析一下
1.关于http/https请求 我就不啰嗦了 如果你接触过面相对象 应该知道其中的继承特性
2.web开发现在都讲究mvc结构 数据操作对应的因该是model层 那么结合继承的特性 如果所有的model都继承一个父model
而由这个父model来初始化数据库连接 那么 实际业务操作中 在你准备访问数据库之前 连接已经建立好了
3.为了安全,一般不会将数据库连接句柄作为全局变量 否则要mvc的结构由什么意义 取而代之的是成员属性 我上面说过 类是可以继承的
假设这个链接在父类的成员属性中保存 那么子类是可以直接访问这个链接的
4.如何来保证不会进行多次数据库连接呢? 比如 A.B两个类都继承base类 base类来进行数据库连接 假设不做处理 在一次请求中需要同时实例化A,B
那么A实例连接一次 B同样一次 为了解决这个问题 就有了一种设计模式 叫做单例模式 也叫单子模式 在web业务中 db cache 队列 的连接请求都可以
用这个模式来避免多次连接 我后边会给你附上一段代码
5.关于数据库连接超时 要明白的是 一次http请求完成后 就需要释放连接 如果程序中不使用sleep()等类似的函数 程序是不会出现长时间不操作的
而且连接的超时时间 是可以由mysql数据库设置的
下面是用php来实现一个单例模式的数据库连接 伪代码 起个示例作用
class mysql{
/**
* 类对象
*/
static public $connect;
/**
* 连接句柄
*/
static public $connectionhandle;
/**
* 初始化数据库连接
* @final
* @prama string $class 类名 default __CLASS__
*/
static public function connectInit($class = __CLASS__){
if(NULL == self::$connect){
self::$connect= new $class;
}
return self::$connect;
}
/**
* 私有化构造 执行数据库连接 生成连接句柄
* @final
*/
private function __construct(){
self::$connectionhandle = new \PDO(
'mysql:host='.Conf::$attr['MYSQL']['MYSQL_CONNECT_HOST'].';'.
'dbname='.Conf::$attr['MYSQL']['MYSQL_SELECT_DB'],
Conf::$attr['MYSQL']['MYSQL_USER'],
Conf::$attr['MYSQL']['MYSQL_PWD']
);
self::$connectionhandle->query('set names'.Conf::$attr['MYSQL']['CHARSETS']);
}
/**
* 私有克隆
*/
private function __clone(){
exit('该类不允许复制');
}
}
class base extends mysql{
/**
* 本类及子类句柄
*/
protected $handle;
/**
* 构造函数 获取数据库连接句柄
*/
public function __construct() {
$msyql = Core::getDb();
$this->handle = $msyql::$connectionhandle;
}
}
分析一下 首先mysql的连接类是不能被直接实例的 然后所有的业务都继承这个base类
这个base类会自动调用mysql中的静态方法 来获得数据库连接 保存在handle属性中
而mysql类中也有检测保证数据库连接直邮一份
然后所有的假设 a 继承base 那么你new a() 的时候 实际上 base中的handle属性已经保存了数据库连接
由于继承 你可以直接在a中访问base的handle属性 假设有b 再new b的以后也一样
以上是我自己看法 仅供参考 如有异议 欢迎交流