在php中,任何变量在页面使用完毕后都会被消除,那么,单例函数也是一样,现在有一个问题:
  既然,php变量都会被销毁,那么,php数据库还有必要做free_result吗??
  如果使用MVC呢?因为页面一直被调用,所以要及时清除数据请求吧?
  想不通,该怎么做??才能让数据库操作更高效点....
  如果可以的话,给个单例模式的数据库操作类吧....
呵呵....

解决方案 »

  1.   

    嗯?单例类函数是都使用static好呢还是不使用好?
    貌似singleton本身已经破坏封装了,也就不存在什么封装性的问题了吧??呵呵....
      

  2.   

    数据库的操作类还可以按照以前的封装模式class DbConn{
    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');
      

  3.   

    单php内也有可能多次数据库请求,free_result还是有用的单例不违反封装吧?
      

  4.   

    <?php
    //连接数据库
    ...
    //查库取结果集放在数组中
    ...
    //以下不再使用数据库连接并且还有几十行代码(此时为何不把连接对象释放掉呢?)
    ...
    MVC中也一样,不过MVC架构中调来调去的情况会更多,所以更应该及时释放。除非在一个脚本文件内,你的数据库连接到了最后一行才不再使用。这时你释放不释放都一样的效果。
    个人觉得,如果你使用了单例模式的数据库连接对象,在并发量很大时,可以不必去手动释放连接对象。并发量很小的情况下仍然要手动释放,此仅仅理论上分析,没有实际验证过。在php中,singleton起到的效果是:当a请求了a页面初始化了singleton后,b请求b页面时发现已经存在singleton就直接使用,否则的话由b页面来初始化。如果你的并发量很大,几乎时时刻刻都在使用连接对象的话,让他一直存在着可以减少其他页面重复的初始化这个连接对象,大部分时间直接使用就可以了。这类似java中的连接池概念。
      

  5.   

    再请教::
    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受单例的影响太大了....呵呵
    不过,觉得这样做好像不利于多数据库主机连接哈.....
    呵呵.....
      

  6.   

    呵呵,抱歉;不过我就是想比较两个代码的差异哈....不过还是说说:
    Code 1 和 Code 2 主要差异是
    code 1 每次都主动请求连接数据库,
    而 Code 2 却是检查是否有存在连接标识?如果有则使用这个连接,没有才从新请求连接(类似于singleton)
    那么问题是:
    这两个代码哪个更好?貌似Code2 更节省资源,
    但如果我是使用多个数据库主机,或者是使用不同权限的用户名时,用Code2的话是不是要每次都释放DB_lnk?然后从新请求??这样一来不就是Code1更省事?
    呵呵,在这两个中徘徊不定哈....
    现在暂时是使用Code1 ,请问还有什么好的建议?我该如何改代码??
    <好像贪心了点,呵呵>