| 123456789101112131415161718192021222324252627282930313233343536 |
- // Package db 负责建立后端到 PostgreSQL 的连接池。
- //
- // 数据库是唯一真值源(docs/overview.md),访问方式为 database/sql 加
- // pgx 驱动、手写 SQL(docs/architecture.md 5.1),不引入 ORM。
- package db
- import (
- "context"
- "database/sql"
- "fmt"
- "time"
- _ "github.com/jackc/pgx/v5/stdlib" // 注册 "pgx" 驱动
- )
- // Open 创建连接池并做一次连通性检查,失败即返回错误,由调用方拒绝启动。
- func Open(ctx context.Context, dsn string) (*sql.DB, error) {
- conn, err := sql.Open("pgx", dsn)
- if err != nil {
- return nil, fmt.Errorf("打开数据库连接失败: %w", err)
- }
- // 连接池与单连接超时:自用单机部署,连接数不宜放大。
- conn.SetMaxOpenConns(10)
- conn.SetMaxIdleConns(5)
- conn.SetConnMaxLifetime(time.Hour)
- pingCtx, cancel := context.WithTimeout(ctx, 5*time.Second)
- defer cancel()
- if err := conn.PingContext(pingCtx); err != nil {
- conn.Close()
- return nil, fmt.Errorf("数据库连通性检查失败: %w", err)
- }
- return conn, nil
- }
|