Golang Go语言中 gin 服务启动端口并初始化数据库连接,是单线程连接数据库吗?

发布于 1周前 作者 vueper 来自 Go语言
// 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 是不是也这种情况?各位大佬有没有遇到这种情况,多核的情况下是怎么个使用的。


Golang Go语言中 gin 服务启动端口并初始化数据库连接,是单线程连接数据库吗?

更多关于Golang Go语言中 gin 服务启动端口并初始化数据库连接,是单线程连接数据库吗?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

5 回复

多虑了,有连接池. 参见 *sql.DB.SetMaxOpenConns

更多关于Golang Go语言中 gin 服务启动端口并初始化数据库连接,是单线程连接数据库吗?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


https://pkg.go.dev/database/sql#Open

看文档,应该是开了一个并发安全的连接池。理论上性能应该比 python 要高

其实是个连接池

底层帮你做好了

在Golang中使用Gin框架启动Web服务并初始化数据库连接时,关于数据库连接是否为单线程,这取决于你如何配置和使用数据库连接池。

Gin框架本身是一个高性能的HTTP Web框架,用于构建Go语言的Web应用和服务,但它并不直接管理数据库连接。数据库连接的管理通常由具体的数据库驱动和连接池库来处理。

在Go中,常见的数据库驱动如database/sql和第三方库(如gormxorm等)都支持连接池。这些库允许你配置最大连接数、最大空闲连接数等参数,以优化数据库连接的管理。

当你初始化数据库连接时,通常是在主函数中配置一个全局的数据库连接池。这个连接池会在整个应用的生命周期内被多个goroutine共享,用于处理来自Gin服务的并发数据库请求。

因此,Gin服务启动端口并初始化数据库连接并不是单线程连接数据库。相反,通过配置连接池,你可以实现多线程(或称为并发)的数据库访问,从而提高应用的性能和吞吐量。

需要注意的是,确保你的数据库连接池配置合理,以避免资源耗尽或性能瓶颈。此外,还要确保在应用关闭时正确关闭数据库连接池,以释放资源。

综上所述,Gin服务启动和数据库连接初始化并不是单线程的,而是支持并发访问的。

回到顶部