前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >RPCX的service中使用Mysql笔记(1)

RPCX的service中使用Mysql笔记(1)

原创
作者头像
用户2825890
修改2020-12-14 15:21:30
4800
修改2020-12-14 15:21:30
举报
文章被收录于专栏:点滴随笔

RPCX的业务逻辑存在于service中,业务通过暴露结构体方法(下称方法)提供RPC服务。业务方法中不可避免的要使用数据库服务。例如在某个服务中存在以下访问用户信息的业务:

service.go

代码语言:go
复制
...
type Member struct {
     User_id int
     Mobile int
}
...
func (user *User) UserInfo(ctx context.Context, args *Args, reply *Reply) error {
	dbcnt:=make(map[string]string)
	dbcnt["username"] = "root"
	dbcnt["password"] = "********"
	dbcnt["port"] = "3306"
	dbcnt["database"] = "database"
	dbcnt["network"]  = "tcp"
	dbcnt["server"]   = "127.0.0.1"
	d:=new(db.Sqlstruct)
	d.Connt(dbcnt)
	d.Table("user")
	d.Field("mobile,user_id")
	d.Where("user_id=123456")
	d.Limit("0,1")
	var find  = &Member{"mobile","user_id"}
	fmt.Println("-------")
	// var fd interface{}
	res:=d.Select(find)
	...
	return nil
}

以上代码就是一个在服务中使用mysql完整的例子,但这样会存在问题,当发起RPC调用时会重新创建Mysql连接。如果在高并发的场景根本无法满足性能要求。性能问题主要体现在max_connection和open_files_limit受限,同时还会引发连接阻塞

当然,就这两个问题,本身就提供了解决的思路--最大连接数和tpc打开数

1、golang的mysql提供了连接池,解决连接复用:

example/db/db.go

代码语言:go
复制
...
    db.SetMaxOpenConns(500)//最大连接数,当一个查询结束,就会立限返回连接池。
    db.SetMaxIdleConns(16)
...    

2、将数据库的连接对像在业务服务service.go之外创建,并且在RPC调用时传递数据库的连接对像,供服务使用:

example/db/db.go

代码语言:go
复制
...
type Sqlmodel struct{
      Wher string
      Joinn string
      Wherestring string
      order string
      limit string
      alias string
      table string
      group string
      update string
      save string
      field string
      DB sql.DB
      Rows interface{}
      Row interface{}
      sync.RWMutex //在多个服务中使用同一个数据库对像,一定要使用同步锁
}
...

server.go

代码语言:go
复制
import(
  example/db
)
func main() {
	flag.Parse()
	s := server.NewServer()
	addRegistryPlugin(s)
    dbcnt:=make(map[string]string)
    dbcnt["username"] = "root"
	dbcnt["password"] = "********"
	dbcnt["port"] = "3306"
	dbcnt["database"] = "database"
	dbcnt["network"]  = "tcp"
	dbcnt["server"]   = "127.0.0.1"
    // var Db *sql.DB
    d:=new(db.Sqlmodel)
    d.Connt(dbcnt)
    usermodel := user.User{*d}//此处的user为服务中的user struct,这里是
    s.RegisterName("User", &usermodel, "")//在server中创建数据库对像传递到方法中使用
	s.Serve("tcp", *addr)
}
...
代码语言:go
复制
...
s.RegisterName("User",&usermodel,"")
...

以上代码解决了在业务方法中创建数据库对像带来的性能问题。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档