2026-05-13 16:07:25 +08:00

49 lines
1.2 KiB
Go

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()
}