【手把手教你】Swoft 多库连接池配置

这里的多库是指数据不同的两个主库

并不是数据相同的主从库

多库的配置非常简单, 只涉及到配置文件和两个类PoolConfig Pool

配置文件

编辑配置文件 config/properties/db.php
新增数据库配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
'dev' => [
'master' => [
'name' => 'master2',
'uri' => [
'192.168.1.135:3306/test?user=tender&password=123456&charset=utf8',
],
],
'slave' => [
'name' => 'slave3',
'uri' => [
'192.168.1.135:3306/test?user=tender&password=123456&charset=utf8',
],
],
],

加完如下
title

默认的masterslave应为default下的配置, 为了兼容历史版本

连接池配置类

新建app/Pool/Config/DevPoolConfig.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php

namespace App\Pool\Config;

use Swoft\Bean\Annotation\Bean;
use Swoft\Bean\Annotation\Value;
use Swoft\Db\Pool\Config\DbPoolProperties;

/**
* DevPoolConfig
* @Bean()
*/
class DevPoolConfig extends DbPoolProperties
{
/**
* @Value(name="${config.db.dev.master.name}")
* @var string
*/
protected $name = '';

/**
* @Value(name="${config.db.dev.master.uri}")
* @var array
*/
protected $uri = [];
}

连接池配置类只是把配置文件由数组改写为类, 有其他配置需要全部加进去。 这里只改了name 和uri

连接池

新建app/Pool/DevPool.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php

namespace App\Pool;

use App\Pool\Config\DevPoolConfig;
use Swoft\Bean\Annotation\Inject;
use Swoft\Bean\Annotation\Pool;
use Swoft\Db\Pool\DbPool;

/**
* DevPool
*
* @Pool("dev.master")
*/
class DevPool extends DbPool
{
/**
* @Inject()
* @var DevPoolConfig
*/
public $poolConfig;
}

更简单, 指定该连接池使用哪个配置
注意下@Pool 注解连接池别名, 要带.master或者.salve

使用连接池

有两种方法使用连接池
第一种是在实体类@Entity 注解里配置instance字段:

1
2
3
4
5
6
7
8
/**
* 用户实体
* @Entity(instance="dev.master")
* @Table(name="user")
*/
class User extends Model
{
...

这样调用该实体就会走dev的配置

第二种是在Db::query() 查询时指定连接池, 直接在方法第三个参数配置即可:

1
Db::query("show databases;",[], 'dev.master')->getResult();