# 创建引擎组 在xorm中,通过创建引擎组EngineGroup来实现对从数据库(Master/Slave)读写分离的支持。在[创建引擎](https://www.kancloud.cn/xormplus/xorm/167078)章节中,我们已经介绍过了,在xorm里面,可以同时存在多个Orm引擎,一个Orm引擎称为Engine,一个Engine一般只对应一个数据库,而EngineGroup一般则对应一组数据库。EngineGroup通过调用xorm.NewEngineGroup生成,如: ~~~ 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;", "postgres://postgres:root@localhost:5432/test1?sslmode=disable;", "postgres://postgres:root@localhost:5432/test2?sslmode=disable", } var err error eg, err = xorm.NewEngineGroup("postgres", conns) } ~~~ or ~~~ 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()来手动关闭,但是一般情况下可以不用关闭,在程序退出时会自动关闭。 * 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给定负载策略,该参数将在[负载策略](https://www.kancloud.cn/xormplus/xorm/413727)章节详细介绍,如示例中未指定,则默认为轮询负载策略。 * 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` 设置引擎组负载策略