package mysql import ( "context" "database/sql" "strings" _ "github.com/go-sql-driver/mysql" "hyapp/pkg/xerr" ) // Store 持有 notice-service 自己的 MySQL 连接池。 // 业务模块通过 DB 共享同一个连接池,但不能绕过各自模块仓储直接写状态。 type Store struct { DB *sql.DB } // Open 创建 notice-service 基础连接池,并在启动期完成一次 ping。 func Open(ctx context.Context, dsn string) (*Store, error) { if strings.TrimSpace(dsn) == "" { return nil, xerr.New(xerr.InvalidArgument, "mysql_dsn is required") } db, err := sql.Open("mysql", dsn) if err != nil { return nil, err } if err := db.PingContext(ctx); err != nil { _ = db.Close() return nil, err } return &Store{DB: db}, nil } // Ping 给 gRPC health 和 HTTP health 复用,不混入具体业务表检查。 func (s *Store) Ping(ctx context.Context) error { if s == nil || s.DB == nil { return xerr.New(xerr.Unavailable, "mysql store is not configured") } return s.DB.PingContext(ctx) } // Close 释放连接池;业务 worker 必须在调用前完成 drain。 func (s *Store) Close() error { if s == nil || s.DB == nil { return nil } return s.DB.Close() }