引擎组

通过创建引擎组 EngineGroup 来实现对从数据库(Master/Slave)读写分离的支持。在 xorm 里面,可以同时存在多个 Orm 引擎,一个 Orm 引擎称为 Engine,一个Engine 一般只对应一个数据库,而 EngineGroup 一般则对应一组数据库。EngineGroup 通过调用 xorm.NewEngineGroup 生成。

 

1. 创建 EngineGroup

import (
    _ "github.com/lib/pq"
    "github.com/xormplus/xorm"
)

var eg *xorm.EngineGroup

func main() {
    conns := []string{
        "postgres://postgres:root@localhost:5432/test?sslmode=disable;", // 第一个默认是master
        "postgres://postgres:root@localhost:5432/test1?sslmode=disable;", // 第二个开始都是slave
        "postgres://postgres:root@localhost:5432/test2?sslmode=disable",
    }

    var err error
    eg, err = xorm.NewEngineGroup("postgres", conns)
}

或者

import (
    _ "github.com/lib/pq"
    "github.com/xormplus/xorm"
)

var eg *xorm.EngineGroup

func main() {
    var err error
    master, err := xorm.NewEngine("postgres", "postgres://postgres:root@localhost:5432/test?sslmode=disable")
    if err != nil {
        return
    }

    slave1, err := xorm.NewEngine("postgres", "postgres://postgres:root@localhost:5432/test1?sslmode=disable")
    if err != nil {
        return
    }

    slave2, err := xorm.NewEngine("postgres", "postgres://postgres:root@localhost:5432/test2?sslmode=disable")
    if err != nil {
        return
    }

       slaves := []*xorm.Engine{slave1, slave2}
    eg, err = xorm.NewEngineGroup(master, slaves)
}

创建完成EngineGroup之后,并没有立即连接数据库,此时可以通过eg.Ping()来进行数据库的连接测试是否可以连接到数据库,该方法会依次调用引擎组中每个Engine的Ping方法。另外对于某些数据库有连接超时设置的,可以通过起一个定期Ping的Go程来保持连接鲜活。EngineGroup可以通过eg.Close()来手动关闭,但是一般情况下可以不用关闭,在程序退出时会自动关闭。

 

2. EngineGroup 方法

  • NewEngineGroup方法
func NewEngineGroup(args1 interface{}, args2 interface{}, policies ...GroupPolicy) (*EngineGroup, error)

前两个参数的使用示例如上,有两种模式。
模式一:通过给定DriverName,DataSourceName来创建引擎组,每个引擎使用相同的Driver。每个引擎的DataSourceNames是[]string类型,第一个元素是Master的DataSourceName,之后的元素是Slave的DataSourceName。
模式二:通过给定 xorm.Engine,[] xorm.Engine来创建引擎组,每个引擎可以使用不同的Driver。第一个参数为 Master的 xorm.Engine,第二个参数为 Slave的[] xorm.Engine。
NewEngineGroup方法,第三个参数为policies,为Slave给定负载策略,该参数将在负载策略章节详细介绍,如示例中未指定,则默认为轮询负载策略。

  • Master方法
func (eg *EngineGroup) Master() *Engine

返回Master数据库引擎。

  • Slave方法
func (eg *EngineGroup) Slave() *Engine

依据给定的负载策略返回一个Slave数据库引擎

  • Slaves方法
func (eg *EngineGroup) Slaves() []*Engine

返回所以Slave数据库引擎。

  • GetSlave方法
func (eg *EngineGroup) GetSlave(i int) *Engine

依据一组Slave数据库引擎[]*xorm.Engine下标返回指定Slave数据库引擎。通过给定DriverName,DataSourceName来创建引擎组,则DataSourceName的第二个元素的数据库为下标0的Slave数据库引擎。

  • SetPolicy方法
func (eg *EngineGroup) SetPolicy(policy GroupPolicy) *EngineGroup

设置引擎组负载策略。

引擎组负载策略:通过 xorm.NewEngineGroup 创建 EngineGroup 时,第三个参数为 policies,我们可以通过该参数来指定 Slave 访问的负载策略。如创建 EngineGroup 时未指定,则默认使用轮询的 ...