shared.go 1.0 KB

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