package database import ( "base-go-v2/internal/config" "database/sql" "fmt" "time" _ "github.com/lib/pq" ) var DB *sql.DB var defaultPoolConfig = struct { MaxOpenConns int MaxIdleConns int ConnMaxLifetime time.Duration }{ MaxOpenConns: 10, MaxIdleConns: 5, ConnMaxLifetime: 30 * time.Minute, } func InitDb() error { d := config.Db // 构造 DSN dsn := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=disable", d.Host, d.Port, d.User, d.Password, d.Dbname) db, err := sql.Open("postgres", dsn) if err != nil { return fmt.Errorf("打开数据库失败: %w", err) } // 设置连接池(使用默认值,如果用户没传) maxOpenConns := d.MaxOpenConns if maxOpenConns == 0 { maxOpenConns = defaultPoolConfig.MaxOpenConns } db.SetMaxOpenConns(maxOpenConns) maxIdleConns := d.MaxIdleConns if maxIdleConns == 0 { maxIdleConns = defaultPoolConfig.MaxIdleConns } db.SetMaxIdleConns(maxIdleConns) connMaxLifetime := d.ConnMaxLifetime if connMaxLifetime == 0 { connMaxLifetime = defaultPoolConfig.ConnMaxLifetime } db.SetConnMaxLifetime(connMaxLifetime) // 测试连接 if err := db.Ping(); err != nil { return fmt.Errorf("数据库连接测试失败: %w", err) } DB = db return nil }