连接多个数据库

最后更新于:2022-04-02 07:07:59

## 连接多个数据库 >[success] Redis 也是同样的配置方法,只是 ::class 不同 通常需求中连接两个数据库有以下两种情况: - 第二个库频繁使用 - 第二个库少量使用 ## 第二个库频繁使用 配置一个新的 ConnectionPool::class 类的 Bean 调用另一个数据库 >[danger] 使用该功能需先阅读 "核心功能 > 依赖注入" 章节 首先在 .env 增加新的数据库使用的连接信息: ~~~ DATABASE_DSN_2='mysql:host=127.0.0.1;port=3306;charset=utf8;dbname=test' DATABASE_USERNAME_2=root DATABASE_PASSWORD_2= ~~~ 然后在 manifest.php 增加名称为 `db2` 的 Connection::class 依赖配置: - 配置中使用了上面配置的新环境变量 ~~~ // Database [ // 名称 'name' => 'db2', // 类路径 'class' => \Mix\Database\Connection::class, // 初始化方法 'initMethod' => 'connect', // 属性注入 'properties' => [ // 数据源格式 'dsn' => getenv('DATABASE_DSN_2'), // 数据库用户名 'username' => getenv('DATABASE_USERNAME_2'), // 数据库密码 'password' => getenv('DATABASE_PASSWORD_2'), // 驱动连接选项: http://php.net/manual/zh/pdo.setattribute.php 'attributes' => [ // 设置默认的提取模式: \PDO::FETCH_OBJ | \PDO::FETCH_ASSOC \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC, // 超时 \PDO::ATTR_TIMEOUT => 5, ], // 事件调度器 'eventDispatcher' => ['ref' => \Mix\Event\EventDispatcher::class], ], ], ~~~ 新增一个拨号器 Database2Dialer::class: - 通过依赖名称 `db2` 实例化数据库连接对象 ~~~ */ class Database2Dialer implements DialerInterface { /** * 拨号 * @return Connection */ public function dial() { // 创建一个连接并返回 return context()->get('db2'); } } ~~~ 在 manifest.php 增加名称为 `dbPool2` 的 ConnectionPool::class 依赖配置: - 配置中 dialer 属性引用了 Database2Dialer::class 完成拨号 ~~~ // Database连接池 [ // 名称 'name' => 'dbPool2', // 作用域 'scope' => \Mix\Bean\BeanDefinition::SINGLETON, // 类路径 'class' => \Mix\Database\Pool\ConnectionPool::class, // 属性注入 'properties' => [ // 最多可空闲连接数 'maxIdle' => 5, // 最大连接数 'maxActive' => 50, // 拨号器 'dialer' => ['ref' => \App\Common\Dialers\Database2Dialer::class], ], ], // Database连接池拨号 [ // 类路径 'class' => \App\Common\Dialers\Database2Dialer::class, ], ~~~ 业务代码中调用: ~~~ /** @var \Mix\Database\Pool\ConnectionPool $dbPool */ $dbPool = context()->get('dbPool2'); $db = $dbPool->getConnection(); //... $db->release(); // 不手动释放的连接不会归还连接池,会在析构时丢弃 ~~~ ## 第二个库少量使用 通过依赖注入直接实例化另一个数据库的连接 >[danger] 使用该功能需先阅读 "核心功能 > 依赖注入" 章节 首先在 .env 增加新的数据库使用的连接信息: ~~~ DATABASE_DSN_2='mysql:host=127.0.0.1;port=3306;charset=utf8;dbname=test' DATABASE_USERNAME_2=root DATABASE_PASSWORD_2= ~~~ 然后在 manifest.php 增加名称为 `db2` 的 Connection::class 依赖配置: - 配置中使用了上面配置的新环境变量 ~~~ // Database [ // 名称 'name' => 'db2', // 类路径 'class' => \Mix\Database\Connection::class, // 初始化方法 'initMethod' => 'connect', // 属性注入 'properties' => [ // 数据源格式 'dsn' => getenv('DATABASE_DSN_2'), // 数据库用户名 'username' => getenv('DATABASE_USERNAME_2'), // 数据库密码 'password' => getenv('DATABASE_PASSWORD_2'), // 驱动连接选项: http://php.net/manual/zh/pdo.setattribute.php 'attributes' => [ // 设置默认的提取模式: \PDO::FETCH_OBJ | \PDO::FETCH_ASSOC \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC, // 超时 \PDO::ATTR_TIMEOUT => 5, ], // 事件调度器 'eventDispatcher' => ['ref' => \Mix\Event\EventDispatcher::class], ], ], ~~~ 业务代码中调用: ~~~ /** @var \Mix\Database\Connection $db */ $db = context()->get('db2'); ~~~
';