背景
项目中其他模块需要MySQL数据库的访问接口,需要一个可靠且高效的数据库连接机制来支持这些功能。为了简化数据库连接管理和提高应用性能,采用了GORM(Go语言的对象关系映射库)来实现数据库交互。
需求
需求分析
-
单一实例:确保在整个应用程序生命周期内仅初始化一次数据库连接,并提供一个全局访问点来获取这个连接。这有助于节省资源并避免重复建立连接带来的性能损耗。
-
延迟初始化(Lazy Initialization):数据库连接应在首次使用时进行初始化,而不是在程序启动时立即初始化,以提高应用启动速度和减少不必要的资源占用。
-
配置管理:支持通过外部配置文件动态设置数据库连接参数,如用户名、密码、主机地址、端口号、数据库名称等信息,以便于根据不同环境(开发、测试、生产)灵活调整。
-
连接池配置:
- 设置最大空闲连接数(MaxIdleConns),优化数据库连接的使用效率。
- 设置最大打开连接数(MaxOpenConns),限制同时可以使用的数据库连接数量,防止过度占用数据库资源。
- 设置连接的最大存活时间(ConnMaxLifetime),保证数据库连接的新鲜度和稳定性。
-
错误处理:当数据库连接失败或初始化过程中出现错误时,应抛出异常(panic),以中断程序执行,防止后续逻辑基于错误状态继续运行。
-
资源释放:提供一种机制来关闭数据库连接,确保在应用程序结束时正确释放所占用的资源。
-
并发安全:考虑到多线程环境下对数据库连接的并发访问需求,解决方案必须保证线程安全性,避免竞态条件等问题。
实现细节对应需求
-
单一实例:
- 使用了全局变量
db
存储唯一的数据库连接实例。 sync.Once
类型的dbOnce
确保openDB
函数只会被执行一次。
- 使用了全局变量
-
延迟初始化:
GetDB
函数利用dbOnce.Do(openDB)
实现了延迟加载,只有当第一次调用该函数时才会触发数据库连接的初始化。
-
配置管理:
config.GetGlobalConfig().DbConfig
用于从外部配置文件中读取数据库相关的配置信息。
-
连接池配置:
- 在成功建立数据库连接后,通过
sqlDB.SetMaxIdleConns
、sqlDB.SetMaxOpenConns
和sqlDB.SetConnMaxLifetime
方法设置了连接池的相关参数。
- 在成功建立数据库连接后,通过
-
错误处理:
- 当
gorm.Open
返回错误或者尝试获取原生数据库连接失败时,会引发panic,阻止程序继续运行。
- 当
-
资源释放:
- 提供了
CloseDB
函数,允许手动关闭数据库连接。
- 提供了
-
并发安全:
sync.Once
确保了在多线程环境中数据库连接的初始化是线程安全的,避免了多个goroutine同时尝试初始化数据库连接的问题。
设计模式——单例模式
单例模式(Singleton Pa