当前位置: 首页 > 面试题库 >

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

苏乐
2023-03-14
问题内容

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

全局编码

$conn = new PDO(...);

function getSomething()
{
    global $conn;
    .
    .
    .
}

用Singleton编码

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();
    .
    .
    .
}

如果除了全局或单例之外,还有一种更好的初始化数据库连接的方法,请提及它并描述它比全局或单例具有的优势。


问题答案:

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

当您考虑编写一段代码时,假设它会改变。这并不意味着您要假设它会在将来的某个时刻对它进行更改,而是要进行某种形式的更改。

将其作为目标可以减轻将来进行更改的痛苦:全球性组织很危险,因为很难在一个地方进行管理。如果将来我想让该数据库连接上下文知道怎么办?如果我希望它每使用5次就关闭并重新打开一次,该怎么办?如果我决定为了扩展我的应用程序而要使用10个连接池怎么办?还是可配置数量的连接?

一个 单身的工厂
为您提供了灵活性。我以很少的额外复杂性进行设置,并且获得的不仅仅是访问同一连接。稍后,我将能够以一种简单的方式更改该连接传递给我的方式。

请注意,我说的是 singleton工厂 ,而不是 单例
。单例与全局之间几乎没有什么区别。因此,没有理由建立单例连接:为什么当您可以创建常规全局变量时,为什么要花时间进行设置呢?

工厂能为您带来什么是获得连接的原因,并且是一个单独的位置来决定您将获得的连接(或连接)。

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();
    .
    .
    .
}

然后,在6个月内,当您的应用程序非常出名,并且变得笨拙而又断线,并且您决定需要的连接不止一个时,您要做的就是在getConnection()方法中实现一些池化。或者,如果您决定要实现SQL日志记录的包装器,则可以传递PDO子类。或者,如果您决定在每次调用时都需要一个新的连接,则可以这样做。它是灵活的,而不是僵化的。

16行代码,包括花括号,可以节省您数小时的时间,也可以节省数小时的重构工作。

请注意,我不考虑这种“功能蠕变”,因为在第一轮测试中我没有进行任何功能实现。这是边界线“ Future Creep”,但在某些时候,“为今天的明天编码”
始终 是一件坏事的想法对我来说并不成立。



 类似资料:
  • 我也使用了SQL和Oracle,但我有一个很大的困惑。在oracle中,用户属于数据库还是数据库属于用户。因为我已经使用sql命令在oracle中创建了一个新用户。然后我创建了表,但我没有创建任何数据库,那么新表去了哪里? 我猜想表与oracle中的用户相关联,就像创建表的人是表的所有者,其他用户无法访问该表,因此无需通过先创建数据库,然后在其下创建表来区分它们。 但是在MYSQL中(使用PhpM

  • 问题内容: 用Java创建单例的最佳方法是什么?数据库连接是否应该是单例连接(单例连接是自动线程安全的)?因为理论上数据库不能被许多用户同时访问。 问题答案: 数据库连接通常不应为单例。 两个原因: 许多数据库驱动程序不是线程安全的。使用单例意味着如果您有多个线程,它们将共享同一连接。单例模式不会给您带来安全感。它仅允许许多线程轻松共享“全局”实例。 就我个人而言,我认为Singleton通常会导

  • 本文向大家介绍SVM和全部数据有关还是和局部数据有关?相关面试题,主要包含被问及SVM和全部数据有关还是和局部数据有关?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: SVM只和分类界限上的支持向量点有关,换而言之只和局部数据有关。

  • 问题内容: 这个问题已经在这里有了答案 : 11年前关闭。 精确重复 表命名难题:单数与复数名称 使用单数或复数数据库表名称更好吗?有公认的标准吗? 我听到有人支持和反对它,你们怎么看? 问题答案: 恕我直言,表名称应像客户一样是复数形式。 如果类名映射到“客户”表中的一行,则其名称应与“客户”一样为单数形式。

  • 问题内容: 我正在使用ADO.Net连接到某些Sql Server和Oracle数据库,并且我想同时运行一些查询。 我将SqlClient名称空间中的类用于Sql Server,将ODP.Net用于Oracle。对于Sql Server,我在连接字符串中添加了MARS选项,并在SqlCommand上调用了异步API。ODP.Net不提供异步API,因此我必须为并发的Oracle命令分配单独的线程。

  • 问题内容: 我通过PDO访问我的MySQL数据库。我正在设置对数据库的访问,而我的第一次尝试是使用以下内容: 我想到的第一件事是: 这被认为是不好的做法。稍作搜索后,我得到了Singleton模式,该模式 “适用于需要一个类的单个实例的情况。” 根据手册中的示例,我们应该这样做: 为什么我需要这个相对较大的课程? 最后一个效果很好,我不必担心了。 如何创建较小的单例类,或者在PHP中缺少单例的用例