在php中,任何变量在页面使用完毕后都会被消除,那么,单例函数也是一样,现在有一个问题:
既然,php变量都会被销毁,那么,php数据库还有必要做free_result吗??
如果使用MVC呢?因为页面一直被调用,所以要及时清除数据请求吧?
想不通,该怎么做??才能让数据库操作更高效点....
如果可以的话,给个单例模式的数据库操作类吧....
呵呵....
既然,php变量都会被销毁,那么,php数据库还有必要做free_result吗??
如果使用MVC呢?因为页面一直被调用,所以要及时清除数据请求吧?
想不通,该怎么做??才能让数据库操作更高效点....
如果可以的话,给个单例模式的数据库操作类吧....
呵呵....
貌似singleton本身已经破坏封装了,也就不存在什么封装性的问题了吧??呵呵....
private static $__instance = null;
private function __construct(){
}
#析构函数,释放资源
private function __destruct(){
self::$__instance = null;
}
public static function instance(){
if(self::$__instance == NULL){
self::$__instance = new MDDriver(config::DSN);//new 一个数据库操作的对象
}
return self::$__instance;
}
}在使用过程中可以这样:
DbConn::instance()->executeQuery('select * from test');
//连接数据库
...
//查库取结果集放在数组中
...
//以下不再使用数据库连接并且还有几十行代码(此时为何不把连接对象释放掉呢?)
...
MVC中也一样,不过MVC架构中调来调去的情况会更多,所以更应该及时释放。除非在一个脚本文件内,你的数据库连接到了最后一行才不再使用。这时你释放不释放都一样的效果。
个人觉得,如果你使用了单例模式的数据库连接对象,在并发量很大时,可以不必去手动释放连接对象。并发量很小的情况下仍然要手动释放,此仅仅理论上分析,没有实际验证过。在php中,singleton起到的效果是:当a请求了a页面初始化了singleton后,b请求b页面时发现已经存在singleton就直接使用,否则的话由b页面来初始化。如果你的并发量很大,几乎时时刻刻都在使用连接对象的话,让他一直存在着可以减少其他页面重复的初始化这个连接对象,大部分时间直接使用就可以了。这类似java中的连接池概念。
CODE 1::
private function DB_lnk($H = DBH, $U = DBU, $P = DBP){//连接数据库,返回数据连接标识
if (null == $H || null == $U || null == $P){
//如果没有连接资源则抛出异常,释放连接资源
db::Error('数据库配置错误::没有配置资源!');
$this -> DB_Host = null;
return $this -> DB_lnk = null;
exit;
}else{
if (null == $this -> DB_lnk){
//设置目标主机,返回连接资源
$this -> DB_Host = $H;
return $this -> DB_lnk = mysql_connect($H,$U,$P);
}
return $this -> DB_lnk;
}
}
和CODE2:: private function DB_lnk($H = DBH, $U = DBU, $P = DBP){//连接数据库,返回数据连接标识
if (null == $this -> DB_lnk){
//如果有数据库连接,则使用上一个数据库连接
return $this -> DB_lnk;
}else{
if (null == $H || null == $U || null == $P){
//如果链接资源空则抛出异常,释放资源
db::Error('数据库配置错误::没有配置资源!');
$this -> DB_Host = null;
return $this -> DB_lnk = null;
exit;
}else{
//设置目标主机,返回连接资源
$this -> DB_Host = $H;
return $this -> DB_lnk = mysql_connect($H,$U,$P);
}
}
return $this -> DB_lnk;
}
请问哪个更好点?貌似CODE::2受单例的影响太大了....呵呵
不过,觉得这样做好像不利于多数据库主机连接哈.....
呵呵.....
Code 1 和 Code 2 主要差异是
code 1 每次都主动请求连接数据库,
而 Code 2 却是检查是否有存在连接标识?如果有则使用这个连接,没有才从新请求连接(类似于singleton)
那么问题是:
这两个代码哪个更好?貌似Code2 更节省资源,
但如果我是使用多个数据库主机,或者是使用不同权限的用户名时,用Code2的话是不是要每次都释放DB_lnk?然后从新请求??这样一来不就是Code1更省事?
呵呵,在这两个中徘徊不定哈....
现在暂时是使用Code1 ,请问还有什么好的建议?我该如何改代码??
<好像贪心了点,呵呵>