Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 数据库连接是全局还是单例?_Php_Design Patterns_Singleton - Fatal编程技术网

Php 数据库连接是全局还是单例?

Php 数据库连接是全局还是单例?,php,design-patterns,singleton,Php,Design Patterns,Singleton,在PHP中使用单例而不是全局数据库连接有什么好处?我觉得使用单例而不是全局使代码变得不必要的复杂 全局代码 单例编码 如果有比全局或单例更好的初始化数据库连接的方法,请提及它,并描述它相对于全局或单例的优势。它非常简单。永远不要使用全局连接或单一连接。如果你不打算使用持久连接,并且有不这样做的情况,我发现在OO设计中,单一连接在概念上比全局连接更容易接受 在真正的OO体系结构中,单例连接比每次创建对象的新实例更有效。我不确定能否回答您的具体问题,但我想建议,如果这适用于基于web的系统,则全局/

在PHP中使用单例而不是全局数据库连接有什么好处?我觉得使用单例而不是全局使代码变得不必要的复杂

全局代码 单例编码
如果有比全局或单例更好的初始化数据库连接的方法,请提及它,并描述它相对于全局或单例的优势。

它非常简单。永远不要使用全局连接或单一连接。

如果你不打算使用持久连接,并且有不这样做的情况,我发现在OO设计中,单一连接在概念上比全局连接更容易接受


在真正的OO体系结构中,单例连接比每次创建对象的新实例更有效。

我不确定能否回答您的具体问题,但我想建议,如果这适用于基于web的系统,则全局/单例连接对象可能不是最佳方案。DBMS通常被设计为以有效的方式管理大量的唯一连接。如果您使用的是全局连接对象,那么您需要做几件事:

  • 强制页面执行所有数据库操作 连接和杀戮 任何异步页面的尝试 负载

  • 可能持有打开的锁 数据库元素的长度超过 必要时,总体速度会减慢 数据库性能

  • 最大化总数量的 同时连接您的 数据库可以支持和阻止 阻止新用户访问 资源

  • 我相信还有其他潜在的后果。请记住,此方法将尝试为访问站点的每个用户维持数据库连接。如果您只有一个或两个用户,这不是问题。如果这是一个公共网站,您需要流量,那么可伸缩性将成为一个问题

    [编辑]

    在更大规模的情况下,每次点击数据集时创建新连接可能是不好的。然而,答案不是创建一个全局连接并将其用于所有事情。答案是连接池

    通过连接池,可以维护许多不同的连接。当应用程序需要连接时,将检索池中的第一个可用连接,然后在其任务完成后返回到池中。如果请求了连接,但没有可用的连接,则会发生以下两种情况之一:a)如果未达到允许的最大连接数,则会打开一个新连接,或者b)应用程序被迫等待连接可用

    注意:在.Net语言中,连接池默认由ADO.Net对象处理(连接字符串设置所有必需的信息)


    感谢Crad对此的评论。

    对于给定的示例,我认为没有理由使用单例。根据经验,如果我唯一关心的是允许一个对象的单个实例,那么如果语言允许,我更喜欢使用globals。一般来说,我会使用单实例进行数据库连接。。。您不希望每次需要与数据库交互时都创建新连接。。。这可能会影响网络的性能和带宽。。。为什么要创建一个新的,当有一个可用的。。。只要我的2美分


    RWendi

    这两种模式实现了相同的净效果,为数据库调用提供了一个单一的访问点

    就具体实现而言,singleton有一个小优势,即在至少一个其他方法请求之前不会启动数据库连接。实际上,在我编写的大多数应用程序中,这并没有多大区别,但如果您有一些根本不进行任何数据库调用的页面/执行路径,这将是一个潜在的优势,因为这些页面永远不会请求到数据库的连接


    另一个细微的区别是,全局实现可能会无意中践踏应用程序中的其他变量名。您不太可能会意外地声明另一个全局$db引用,尽管您可能会在打算写入if($db==null)时意外地覆盖它(例如,您写入if($db=null)。singleton对象阻止了这一点。

    我知道这很旧,但Dr8k的答案几乎就在那里

    当你考虑写一段代码时,假设它会发生变化。这并不意味着你假设它在将来某个时候会发生什么样的变化,而是会发生某种形式的变化

    将其作为一个目标来减轻未来进行更改的痛苦:全局设置是危险的,因为它很难在单个位置进行管理。如果我想在将来使该数据库连接上下文感知,该怎么办?如果我想让它每使用5次就自动关闭并重新打开一次该怎么办?如果为了扩展我想要的应用程序,我决定这样做该怎么办使用10个连接的池?或可配置的连接数

    单例工厂为您提供了这种灵活性。我只需很少的额外复杂性就可以设置它,并且获得的不仅仅是对同一连接的访问;我还可以在以后以简单的方式更改该连接传递给我的方式

    请注意,我说的是单例工厂,而不是简单的单例工厂。单例工厂和全局工厂之间的差别很小,是的。正因为如此,没有理由建立单例连接:既然可以创建一个常规的全局工厂,为什么还要花时间来建立它

    工厂给你的是一个为什么要获得连接,以及一个单独的点来决定你要获得什么连接(或连接)

    例子 然后,在6个月后,当你的应用程序变得非常有名,并且变得笨拙不堪,你决定需要不止一个连接时,你所要做的就是在getConnection()方法中实现一些池
    $conn = new PDO(...);
    
    function getSomething()
    {
        global $conn;
        .
        .
        .
    }
    
    class DB_Instance
    {
        private static $db;
    
        public static function getDBO()
        {
            if (!self::$db)
                self::$db = new PDO(...);
    
            return self::$db;
        }
    }
    
    function getSomething()
    {
        $conn = DB_Instance::getDBO();
        .
        .
        .
    }
    
    class ConnectionFactory
    {
        private static $factory;
        private $db;
    
        public static function getFactory()
        {
            if (!self::$factory)
                self::$factory = new ConnectionFactory(...);
            return self::$factory;
        }
    
        public function getConnection() {
            if (!$this->db)
                $this->db = new PDO(...);
            return $this->db;
        }
    }
    
    function getSomething()
    {
        $conn = ConnectionFactory::getFactory()->getConnection();
        .
        .
        .
    }
    
    <?php // file0.php
    
    final class Main_Class
    {
        private static $instance;
        private $time;
    
        private final function __construct()
        {
            $this->time = 0;
        }
        public final static function getInstance() : self
        {
            if (self::$instance instanceof self) {
                return self::$instance;
            }
    
            return self::$instance = new self();
        }
        public final function __clone()
        {
            throw new LogicException("Cloning timer is prohibited");
        }
        public final function __sleep()
        {
            throw new LogicException("Serializing timer is prohibited");
        }
        public final function __wakeup()
        {
            throw new LogicException("UnSerializing timer is prohibited");
        }
    }
    
    <?php // file1.php
    global $YUZO;
    $YUZO = new YUZO; // YUZO is name class
    
    <?php // file2.php
    global $YUZO;
    $YUZO->method1()->run();
    $YUZO->method2( 'parameter' )->html()->print();