错误代码
代码如下:
package daoConfig
import (
me "QNSYHome/error"
"context"
"fmt"
"github.com/spf13/viper"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"gorm.io/driver/postgres"
"gorm.io/gorm"
"time"
)
var MongoDB *mongo.Database
var PostGreSqlDB *gorm.DB
// BuildPostgresqlClient 建立Postgresql数据库连接
func BuildPostgresqlClient() {
// 从配置文件读取数据库连接信息
viper.SetConfigName("application.yaml")
viper.SetConfigType("yaml")
viper.AddConfigPath(".")
err := viper.ReadInConfig()
if err != nil {
panic("读取数据库文件出错")
}
// 读取host 用户名密码等信息
host := viper.GetString("gorm.host")
username := viper.GetString("gorm.username")
pwd := viper.GetString("gorm.password")
sslmode := viper.GetString("gorm.sslmode")
timeZone := viper.GetString("gorm.timeZone")
port := viper.GetString("gorm.port")
dbname := viper.GetString("gorm.dbname")
conn := fmt.Sprintf("host=%s user=%s password=%s dbname=%s port=%s sslmode=%s TimeZone=%s", host, username, pwd, dbname, port, sslmode, timeZone)
// 打开数据库连接
DB, err := gorm.Open(postgres.Open(conn), nil)
if err != nil {
panic("获取数据库连接出错")
}
PostGreSqlDB = DB
}
// MongoClient 连接MongoDB数据库
func MongoClient() {
// 从配置文件读取数据库连接信息
viper.SetConfigName("application.yaml")
viper.SetConfigType("yaml")
viper.AddConfigPath(".")
err := viper.ReadInConfig()
if err != nil {
panic("读取MongoDB数据信息出错")
}
host := viper.GetString("mongo.host")
port := viper.GetString("mongo.port")
uname := viper.GetString("mongo.username")
pwd := viper.GetString("mongo.password")
connectionTimeout := viper.GetInt("mongo.connectionTimeout")
timeout := viper.GetInt("mongo.timeout")
maxPoolSize := viper.GetInt("mongo.maxPoolSize")
maxIdleTimeMS := viper.GetInt("mongo.maxIdleTimeMS")
clientOptions := options.Client().
// 设置连接超时时间为2秒
SetConnectTimeout(time.Duration(connectionTimeout)).
// 设置一次请求的时间不超过2秒
SetTimeout(time.Duration(timeout)).
// 设置最大连接数为20
SetMaxPoolSize(uint64(maxPoolSize)).
// 设置连接的host
SetHosts([]string{fmt.Sprintf("%s:%s", host, port)}).
// 设置连接模式为单例模式
SetDirect(true).
// 设置最大空闲连接数为5分钟
SetMaxConnIdleTime(time.Duration(maxIdleTimeMS)).
// 设置用户名和密码
SetAuth(options.Credential{Username: uname, Password: pwd})
client, err := mongo.Connect(context.TODO(), clientOptions)
if err != nil {
panic(err)
}
// 验证数据库连接.这是必须的,因为mongo.Connect即使连接不上,也不会报错。只能使用Ping来验证连接是否正常。Ping检测的速度和超时时间有关。
err = client.Ping(context.TODO(), nil)
if err != nil {
fmt.Println(err.Error())
e := &me.MongoDBNotConnection{Message: "MongoDB数据库连接失败"}
panic(e)
}
MongoDB = client.Database("qnsy")
}
配置是从yaml读取
mongo:
host: localhost
port: 27017
username: mongoadmin
password: 123456
# 连接数据库的超时时间
connectionTimeout: 5000
# 单次请求的超时时间
timeout: 2000
# 最大连接池
maxPoolSize: 100
# 最大连接空闲时间
maxIdleTimeMS: 1000
启动后报错:
错误原因:
超时时间错误
time.Duration在Go语言中的时间单位是纳秒,time.Duration(5000)就是5000纳秒,所以导致以上连接超时的错误。
Go源码
修改
// MongoClient 连接MongoDB数据库
func MongoClient() {
// 从配置文件读取数据库连接信息
viper.SetConfigName("application.yaml")
viper.SetConfigType("yaml")
viper.AddConfigPath(".")
err := viper.ReadInConfig()
if err != nil {
panic("读取MongoDB数据信息出错")
}
host := viper.GetString("mongo.host")
port := viper.GetString("mongo.port")
uname := viper.GetString("mongo.username")
pwd := viper.GetString("mongo.password")
connectionTimeout := viper.GetInt("mongo.connectionTimeout")
timeout := viper.GetInt("mongo.timeout")
maxPoolSize := viper.GetInt("mongo.maxPoolSize")
maxIdleTimeMS := viper.GetInt("mongo.maxIdleTimeMS")
clientOptions := options.Client().
// 设置连接超时时间为2秒
SetConnectTimeout(time.Second * time.Duration(connectionTimeout)).
// 设置一次请求的时间不超过2秒
SetTimeout(time.Second * time.Duration(timeout)).
// 设置最大连接数为20
SetMaxPoolSize(uint64(maxPoolSize)).
// 设置连接的host
SetHosts([]string{fmt.Sprintf("%s:%s", host, port)}).
// 设置连接模式为单例模式
SetDirect(true).
// 设置最大空闲连接数为5分钟
SetMaxConnIdleTime(time.Duration(maxIdleTimeMS)).
// 设置用户名和密码
SetAuth(options.Credential{Username: uname, Password: pwd})
client, err := mongo.Connect(context.TODO(), clientOptions)
if err != nil {
panic(err)
}
// 验证数据库连接.这是必须的,因为mongo.Connect即使连接不上,也不会报错。只能使用Ping来验证连接是否正常。Ping检测的速度和超时时间有关。
err = client.Ping(context.TODO(), nil)
if err != nil {
fmt.Println(err.Error())
e := &me.MongoDBNotConnection{Message: "MongoDB数据库连接失败"}
panic(e)
}
MongoDB = client.Database("qnsy")
}
yaml
mongo:
host: localhost
port: 27017
username: mongoadmin
password: 123456
# 连接数据库的超时时间
connectionTimeout: 5
# 单次请求的超时时间
timeout: 2
# 最大连接池
maxPoolSize: 100
# 最大连接空闲时间
maxIdleTimeMS:
代码运行正常