连接多个数据库
最后更新于: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');
~~~
';