创建 Engine Group 引擎

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

  1. import (
  2. _ "github.com/lib/pq"
  3. "xorm.io/xorm"
  4. )
  5. var eg *xorm.EngineGroup
  6. func main() {
  7. conns := []string{
  8. "postgres://postgres:root@localhost:5432/test?sslmode=disable;", // 第一个默认是master
  9. "postgres://postgres:root@localhost:5432/test1?sslmode=disable;", // 第二个开始都是slave
  10. "postgres://postgres:root@localhost:5432/test2?sslmode=disable",
  11. }
  12. var err error
  13. eg, err = xorm.NewEngineGroup("postgres", conns)
  14. }

或者

  1. import (
  2. _ "github.com/lib/pq"
  3. "xorm.io/xorm"
  4. )
  5. var eg *xorm.EngineGroup
  6. func main() {
  7. var err error
  8. master, err := xorm.NewEngine("postgres", "postgres://postgres:root@localhost:5432/test?sslmode=disable")
  9. if err != nil {
  10. return
  11. }
  12. slave1, err := xorm.NewEngine("postgres", "postgres://postgres:root@localhost:5432/test1?sslmode=disable")
  13. if err != nil {
  14. return
  15. }
  16. slave2, err := xorm.NewEngine("postgres", "postgres://postgres:root@localhost:5432/test2?sslmode=disable")
  17. if err != nil {
  18. return
  19. }
  20. slaves := []*xorm.Engine{slave1, slave2}
  21. eg, err = xorm.NewEngineGroup(master, slaves)
  22. }

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

  • NewEngineGroup方法
  1. 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方法
  1. func (eg *EngineGroup) Master() *Engine

返回Master数据库引擎

  • Slave方法

    1. func (eg *EngineGroup) Slave() *Engine

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

  • Slaves方法

    1. func (eg *EngineGroup) Slaves() []*Engine

    返回所以 Slave 数据库引擎

  • SetPolicy方法

    1. func (eg *EngineGroup) SetPolicy(policy GroupPolicy) *EngineGroup

    设置引擎组负载策略