V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
longmeier90
V2EX  ›  Go 编程语言

问一下 gin 服务启动了一个端口,初始化时连了一个数据库。请问这个数据库连接是单线程是吧?

  •  
  •   longmeier90 · 2022-09-29 12:10:51 +08:00 · 1684 次点击
    这是一个创建于 546 天前的主题,其中的信息可能已经有所发展或是发生改变。
    // InitDbConn 数据库连接
    func InitDbConn(){
    	dbUrl := global.ServerConfig.HisInfo.DBUrl
    	dbUrl = fmt.Sprintf("%s?%s", dbUrl,"charset=utf8&parseTime=true")
    	MysqlDB, err := sql.Open("mysql", dbUrl)
        
    	if err !=nil{
    		panic(err)
    	}
    	err = MysqlDB.Ping()
    	if err!=nil{
    		panic(err)
    	}
    
    	global.MysqlDB = MysqlDB
    }
    
    // 服务启动方式
    func main() {
    	global.BasePath = utils.ProjectPath()
    	defer initialize.InitClose()
    	initialize.InitConfig() // 初始化配置
    	initialize.InitLogger() // 初始化日志
    	initialize.InitDbConn() // 数据库连接
    	initialize.InitDb() // 数据库连接
    	fmt.Println(" gorm 连接成功...")
    	initialize.InitSrvConn() // grpc 连接
    	fmt.Println(" grpc 连接成功...")
    	global.Logger.Info("数据库连接成功...")
    	fmt.Println(" 数据库连接成功...")
    	global.Logger.Info(fmt.Sprintf("启动服务器,端口:%d", global.Port))
    
    	// 注册 interceptor
    	var opts []grpc.ServerOption
    	opts = append(opts, grpc.UnaryInterceptor(middleware.Interceptor))
    	g := grpc.NewServer(opts...)
    	fee.RegisterGreeterServer(g, &Server{})
    	grpcDns := fmt.Sprintf("0.0.0.0:%v", global.GrpcPort)
    	lis, err := net.Listen("tcp", grpcDns)
    	if err != nil {
    		panic("failed to listen:" + err.Error())
    	}
    	err = g.Serve(lis)
    	if err != nil {
    		panic("failed to start grpc:" + err.Error())
    	}
    	// 接收终止信号
    	quit := make(chan os.Signal)
    	signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
    	<-quit
    }
    
    

    之前 python 就是单线程 初始化了一个 mysql 连接,每个请求都会排队使用 mysql 连接。 问一下 go 是不是也这种情况?各位大佬有没有遇到这种情况,多核的情况下是怎么个使用的。

    4 条回复    2022-09-30 11:50:17 +08:00
    keepeye
        1
    keepeye  
       2022-09-29 12:23:31 +08:00
    多虑了,有连接池. 参见 *sql.DB.SetMaxOpenConns
    kidtest
        2
    kidtest  
       2022-09-29 12:24:39 +08:00
    https://pkg.go.dev/database/sql#Open

    看文档,应该是开了一个并发安全的连接池。理论上性能应该比 python 要高
    someonedeng
        3
    someonedeng  
       2022-09-29 18:41:38 +08:00
    其实是个连接池
    securityCoding
        4
    securityCoding  
       2022-09-30 11:50:17 +08:00
    底层帮你做好了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5880 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 02:13 · PVG 10:13 · LAX 19:13 · JFK 22:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.