Khi nhắc đến Gorm, chắc hẳn nhiều lập trình viên Golang đều biết đến thư viện ORM này. Trong bài viết này, chúng ta sẽ cùng khám phá cách quản lý kết nối đến cơ sở dữ liệu thông qua Gorm mà không đề cập đến connection pool.
Hai Cách Kết Nối Với Gorm
Cách 1: Quản Lý Kết Nối Đơn Giản
go
// Định nghĩa cấu trúc dbInstance
type (
dbInstance struct {
db *gorm.DB
}
)
// Hàm khởi tạo dbInstance
func NewDBInstanceRepository(db *gorm.DB) *dbInstance {
return &dbInstance{
db: db,
}
}
// Hàm truy xuất db
func (l *dbInstance) getDB() *gorm.DB {
return l.db
}
Giải Thích:
- Định nghĩa dbInstance: Đây là một cấu trúc chứa một trường
db
kiểu*gorm.DB
, biểu thị cho một kết nối đến cơ sở dữ liệu. - Hàm NewDBInstanceRepository: Đây là một constructor cho phép khởi tạo một instance của
dbInstance
bằng cách nhận một tham số*gorm.DB
, và trả về con trỏ đếndbInstance
. - Hàm getDB: Hàm này cho phép bạn truy xuất đối tượng
*gorm.DB
từdbInstance
.
Công Dụng:
- Đoạn mã trên giúp đóng gói kết nối cơ sở dữ liệu vào trong một struct, cung cấp phương thức truy cập đơn giản thông qua hàm
getDB
. Đây là cách tiếp cận lý tưởng cho những ứng dụng nhỏ gọn.
Cách 2: Quản Lý Kết Nối Nâng Cao Với Hỗ Trợ Đa Luồng
go
// Sử dụng sync.Map để lưu trữ kết nối
var dbs sync.Map
type DB struct {
*gorm.DB
}
type DBConf struct {
Driver string `yaml:"Driver"`
Host string `yaml:"Host"`
Port int64 `yaml:"Port"`
User string `yaml:"User"`
Password string `yaml:"Password"`
Db string `yaml:"Db"`
Schema string `yaml:"Schema"`
}
// Hàm DbGet để lấy kết nối db
func DbGet(conf DBConf, ops ...func(*gorm.DB)) *DB {
dsn := "config url"
db, ok := dbs.Load(dsn)
if !ok {
// Kết nối với cơ sở dữ liệu
db1, err := gorm.Open(getGormDialetor(conf.Driver, dsn), &gorm.Config{})
dtmimp.E2P(err)
err = db1.Use(&tracePlugin{})
dtmimp.E2P(err)
db = &DB{DB: db1}
for _, op := range ops {
op(db1)
}
dbs.Store(dsn, db)
}
return db.(*DB)
}
Giải Thích:
- Sử dụng sync.Map: Cấu trúc này giúp lưu trữ kết nối cơ sở dữ liệu theo khóa
dsn
, đảm bảo an toàn khi xử lý đa luồng. - Struct DB: Đây là một wrapper cho
*gorm.DB
, cho phép linh hoạt trong việc sử dụng kết nối. - Hàm DbGet: Nhận tham số cấu hình cơ sở dữ liệu và thực hiện việc kết nối hoặc lấy kết nối từ
sync.Map
tùy thuộc vào việc kết nối đã tồn tại hay chưa.
Công Dụng:
- Đảm bảo rằng mỗi
dsn
chỉ có một kết nối duy nhất (theo mẫu Singleton). - Hỗ trợ quản lý kết nối an toàn trong các ứng dụng đa luồng hoặc microservices.
- Thích hợp cho các hệ thống phức tạp với nhiều kết nối khác nhau.
So Sánh Hai Phương Pháp Quản Lý Kết Nối:
Đặc điểm | Cách 1 | Cách 2 |
---|---|---|
Mục tiêu | Quản lý một kết nối cơ sở dữ liệu | Quản lý nhiều kết nối cơ sở dữ liệu |
Phạm vi sử dụng | Ứng dụng nhỏ | Ứng dụng lớn, nhiều kết nối |
Quản lý kết nối | Không có đồng bộ | Có đồng bộ qua sync.Map |
Độ phức tạp | Đơn giản | Phức tạp hơn |
Kết Luận:
Tùy vào nhu cầu của dự án, bạn có thể lựa chọn cách tiếp cận phù hợp. Cách 1 thích hợp cho các ứng dụng nhỏ, trong khi Cách 2 là công cụ tối ưu cho các hệ thống lớn và phức tạp yêu cầu khả năng đồng bộ cao trong quản lý kết nối cơ sở dữ liệu. Hy vọng bài viết này sẽ giúp ích cho bạn trong việc phát triển ứng dụng Golang của mình.
source: viblo