Golang Go语言中 gin 服务启动端口并初始化数据库连接,是单线程连接数据库吗?
// 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
多虑了,有连接池. 参见 *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
和第三方库(如gorm
、xorm
等)都支持连接池。这些库允许你配置最大连接数、最大空闲连接数等参数,以优化数据库连接的管理。
当你初始化数据库连接时,通常是在主函数中配置一个全局的数据库连接池。这个连接池会在整个应用的生命周期内被多个goroutine共享,用于处理来自Gin服务的并发数据库请求。
因此,Gin服务启动端口并初始化数据库连接并不是单线程连接数据库。相反,通过配置连接池,你可以实现多线程(或称为并发)的数据库访问,从而提高应用的性能和吞吐量。
需要注意的是,确保你的数据库连接池配置合理,以避免资源耗尽或性能瓶颈。此外,还要确保在应用关闭时正确关闭数据库连接池,以释放资源。
综上所述,Gin服务启动和数据库连接初始化并不是单线程的,而是支持并发访问的。