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

Symfony2,动态数据库连接/主义服务的早期覆盖

郭志泽
2023-03-14
问题内容

我有一个核心配置数据库,每一行都是带有一些基本配置等的“应用程序”。
一旦选择了应用程序,我想使用该行的属性(ID)连接到数据库,并且主机也可能会更改根据行。

我想要的是注册一个使用这些详细信息来设置Doctrine服务的服务,如果您位于所需站点上的某个位置(我根据URI知道)。

我正在使用实体管理器和各种“教义侦听器/事件”子对象

我玩过ConnectionFactory,但这似乎导致订阅者出现问题。

挂钩可以透明修改Doctrine服务的最佳方法是什么,以便控制器可以在不知道连接到哪个数据库主机和数据库名称的情况下进行操作?

此类型的每个DB将具有相同的结构,因此所有实体映射都是正确的。

我正在寻找一个真正干净的实现,希望使用服务容器来避免任何“ hacks”。

有谁知道这样做吗?


问题答案:

这是新的和改进的非反射版本

#services.yml
acme_app.dynamic_connection:
    class: %acme.dynamic_doctrine_connection.class%
    calls:
        - [setDoctrineConnection, [@doctrine.dbal.default_connection]]


<?php

namespace Acme\Bundle\AppBundle;

use Doctrine\DBAL\Connection;
use Symfony\Component\HttpKernel\Exception\ServiceUnavailableHttpException;
use Exception;

class DynamicDoctrineConnection
{
    /**
     * @var Connection
     */
    private $connection;

    /**
     * Sets the DB Name prefix to use when selecting the database to connect to
     *
     * @param  Connection       $connection
     * @return SiteDbConnection $this
     */
    public function setDoctrineConnection(Connection $connection)
    {
        $this->connection = $connection;

        return $this;
    }

    public function setUpAppConnection()
    {
        if ($this->request->attributes->has('appId')) {
            $connection = $this->connection;
            $params     = $this->connection->getParams();

            // we also check if the current connection needs to be closed based on various things
            // have left that part in for information here
            // $appId changed from that in the connection?
            // if ($connection->isConnected()) {
            //     $connection->close();
            // }

            // Set default DB connection using appId
            //$params['host']   = $someHost;
            $params['dbname'] = 'Acme_App'.$this->request->attributes->get('appId');

            // Set up the parameters for the parent
            $connection->__construct(
                $params, $connection->getDriver(), $connection->getConfiguration(),
                $connection->getEventManager()
            );

            try {
                $connection->connect();
            } catch (Exception $e) {
                // log and handle exception
            }
        }

        return $this;
    }
}


 类似资料:
  • 问题内容: 我正在Laravel 5(.1)中创建一个应用程序,在该应用程序中需要连接到不同的数据库。唯一的问题是,它不知道必须连接到哪个数据库,因此无法在config中使用database.php。控制器负责使用动态给定的连接详细信息进行连接。 如何建立与数据库的新连接,包括使用DB类?(或者这可能) 提前致谢! 问题答案: 最简单的解决方案是在运行时设置数据库配置。Laravel可能希望从文件

  • 问题设置基于Web服务(Spring/Java、Tomcat7和MySql),其中每个用户都有自己的数据库,因此每个请求都需要自己的连接。由于所有数据库都是在运行时动态创建的,因此在启动之前静态配置它们不是一个选项。 为了优化数据库连接使用,数据库连接池的实现将是非常好的,对吗? 使用Java/Spring:如何为动态数据库创建连接池?我有点惊讶于这里缺少干净的选择 问题:Tomcat的连接池(以

  • 我读过萨姆·纽曼的《微服务》一书,在关于分裂整体的一章中,他举了一个“打破外键关系”的例子,他承认跨API进行连接会更慢--但他接着说,如果你的应用程序足够快,它比以前慢有关系吗? 这似乎有点油嘴滑舌?人的经历是什么?您使用了哪些技术来使API联接执行得令人满意?

  • 前言 数据库是 laravel 及其重要的组成部分,大致的讲,laravel 的数据库功能可以分为两部分:数据库 DB、数据库 Eloquent Model。数据库的 Eloquent 是功能十分丰富的 ORM,让我们可以避免写繁杂的 sql 语句。数据库 DB 是比较底层的与 pdo 交互的功能,Eloquent 的底层依赖于 DB。本文将会介绍数据库 DB 中关于数据库服务的启动与连接部分。

  • 我使用PythonGevent的流服务器与另一台机器(远程)进行通信,该机器发送并发TCP/IP请求(平均每秒钟60个请求)。这种通信的本质主要是IO绑定的(短文本,然后是音频流)。我打算使用Postgresql存储每次通信的结果(例如:从远程服务器接收的文件名)。 我认为为Streamserver中生成的每个greenlet调用一个新的db连接是个坏主意(池大小为90所以90 req/sec m

  • 问题内容: 我正在尝试创建一个多租户应用程序(saas),其中每个客户端都有自己的数据库。 我的情况是: 我创建了一个中间件,该中间件将确定谁是基于子域的客户端,然后从常规数据库中检索客户端的数据库连接信息。我不知道如何为此客户端建立连接对象,以便能够在我的控制器中使用。我应该在中间件还是控制器中执行此操作?如果它在模型中,我该如何传递连接字符串和参数(我可以使用会话,但我不知道如何从模型内部访问