0
0
Lập trình
Sơn Tùng Lê
Sơn Tùng Lê103931498422911686980

[Golang] Hướng Dẫn Chi Tiết Quản Lý Kết Nối Database Sử Dụng Gorm

Đăng vào 2 tuần trước

• 3 phút đọc

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 Copy
// Đị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:

  1. Đị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.
  2. 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ỏ đến dbInstance.
  3. 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 Copy
// 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

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào