49 lines
1.2 KiB
Go
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()
|
|
}
|