| 123456789101112131415161718192021222324252627282930 |
- package vrtxsql
- import "git.ycl.pub/yl32940/TsDB2/DB/core"
- // SharedDB 返回该 DSN 共享的引擎实例 (引用计数+1, 调用方须配对调用 ReleaseDB)。
- // 供 GORM Dialector 等需要绕开 SQL、直接调引擎 API 的场景 (schema 自省/AutoMigrate):
- // 它们与 database/sql 驱动打开的连接共享同一个 *core.DB, 引用计数保证引擎
- // 在所有使用者 (连接 + 直连方) 都释放后才真正 Close。
- //
- // 注意: SharedDB 自身不加串行锁, 引擎单写者语义仍由驱动的容量1信号量保证,
- // 直连方 (如 Migrator 的 DDL 调用) 与 SQL 流量并发时需调用方自行串行化。
- func SharedDB(dsn string) (*core.DB, error) {
- s, err := sharedFor(dsn)
- if err != nil {
- return nil, err
- }
- return s.db, nil
- }
- // ReleaseDB 释放一次 SharedDB 的引用; 归零时关闭引擎。
- // 对从未 SharedDB / 已完全释放的 DSN 是安全的 (返回 nil)。
- func ReleaseDB(dsn string) error {
- registry.Lock()
- s, ok := registry.m[dsn]
- registry.Unlock()
- if !ok {
- return nil
- }
- return s.release()
- }
|