db.go 1.0 KB

123456789101112131415161718192021222324252627282930313233343536
  1. // Package db 负责建立后端到 PostgreSQL 的连接池。
  2. //
  3. // 数据库是唯一真值源(docs/overview.md),访问方式为 database/sql 加
  4. // pgx 驱动、手写 SQL(docs/architecture.md 5.1),不引入 ORM。
  5. package db
  6. import (
  7. "context"
  8. "database/sql"
  9. "fmt"
  10. "time"
  11. _ "github.com/jackc/pgx/v5/stdlib" // 注册 "pgx" 驱动
  12. )
  13. // Open 创建连接池并做一次连通性检查,失败即返回错误,由调用方拒绝启动。
  14. func Open(ctx context.Context, dsn string) (*sql.DB, error) {
  15. conn, err := sql.Open("pgx", dsn)
  16. if err != nil {
  17. return nil, fmt.Errorf("打开数据库连接失败: %w", err)
  18. }
  19. // 连接池与单连接超时:自用单机部署,连接数不宜放大。
  20. conn.SetMaxOpenConns(10)
  21. conn.SetMaxIdleConns(5)
  22. conn.SetConnMaxLifetime(time.Hour)
  23. pingCtx, cancel := context.WithTimeout(ctx, 5*time.Second)
  24. defer cancel()
  25. if err := conn.PingContext(pingCtx); err != nil {
  26. conn.Close()
  27. return nil, fmt.Errorf("数据库连通性检查失败: %w", err)
  28. }
  29. return conn, nil
  30. }
苏ICP备2026082406号
苏公网安备 待审核