【问题标题】:PHP using multiple MySQL database connectionsPHP 使用多个 MySQL 数据库连接
【发布时间】:2016-06-17 11:55:37
【问题描述】:

我正在创建一个使用不同服务器上的 3 个不同数据库的应用程序。获取数据发生在我的数据映射器中,每个映射器都扩展了一个抽象的 DataMapper 父类:

abstract class DataMapper {

    protected $db;
    protected $db2;
    protected $db3;

    function __construct() {
        $this->db = new Database('db1');
        $this->db2 = new Database('db2');
        $this->db3 = new Database('db3');
    }

}

但是,对于只需要这 3 个连接之一的页面来说,这有点过分了。为应用程序的每个部分返回正确的数据库连接的最佳方法是什么?我听说过应用程序注册表,但我不知道如何设置类似的东西。

【问题讨论】:

  • 我从here 得到它,应用程序服务器和数据库服务器通常应该是不同的,但是为什么你要为同一个应用程序中使用的不同数据库使用不同的服务器(如果我错了)
  • 其中一个数据库是 PowerDNS MySQL 数据库,它与我的 Web 服务器位于不同的服务器上。
  • new Database('...') 你如何建立与所有 3 个的连接?还是那只是伪的?
  • @Jeremy 你到底是什么意思?选择数据库时,我与new Database('database_name') 建立连接。我需要找到一种方法,这样我就不必一直输入new Database()。我可以为每个数据库编写 3 个抽象 DataMapper 并扩展我的子数据映射器。这会是一种“好的”方式吗?
  • 我不确定。我使用自动装配,所以我想我会做的是让控制器请求他们需要的连接,然后让注入器通过反映控制器参数来完成其余的工作。如果您认为它会回答您的问题,我可以详细说明

标签: php design-patterns datamapper


【解决方案1】:

我不喜欢您设置数据映射器的方式。您正在为每个映射器创建一个新连接,即使它使用已建立连接的提供程序。换句话说,每个数据映射器都会创建一个新的数据库对象。

理想情况下,这些数据库对象应该被保存并传递给需要它们的数据映射器。自动注入通常效果很好。这意味着您不必使用 new 关键字来实例化对象,而是通过对象的构造参数来请求它们。

例如:

class Example1Mapper extends DataMapper {
    function __construct( Provider1 $provider1 ) { ... }
}

class Example2Mapper extends DataMapper {
    function __construct( Provider1 $provider1, Provider2 $provider2 ) { ... }
}

以上,两个映射器类需要不同的提供者。您唯一需要做的就是通过对象的构造函数指定它。自动依赖注入/自动装配完成剩下的工作。

我不知道你的架构是如何建立的,但这就是我所做的:路由器和注入器一起工作。路由器决定应该调用什么控制器以及应该调用什么动作(方法)。喷油器获取此信息并反映控制器的参数。它还反映了参数的参数,等等...注入器创建所有对象并决定传递哪些数据库提供程序、域对象等。 Herehere 将是开始学习注射器的好地方,但您可能想四处阅读。还有一些不错的轻量级 DIC。

【讨论】:

  • 谢谢,这是我可以继续开发的。我有一个路由器,我正在使用一个依赖注入器,它们都可以独立工作。现在我需要找到一种方法将这两个组件结合在一起。
  • @Beeelze 我认为您不一定需要将它们放在一起。只要您的依赖注入器可以反映映射器所需的参数并确定要传递的数据库提供程序
  • 是的,他们可以,没问题。我会将每个提供者的凭据放在哪里以创建连接?在提供者类本身中?现在我正在使用一个 config.php 文件来存储所有数据库的所有凭据。
猜你喜欢
  • 2011-03-18
  • 1970-01-01
  • 2010-10-18
  • 1970-01-01
  • 2017-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-30
相关资源
最近更新 更多