1. 程式人生 > 實用技巧 >go 關於使用gorm 連線數超出最大限制的問題以及解決方案

go 關於使用gorm 連線數超出最大限制的問題以及解決方案

  • 首先檢視連線伺服器的資料庫的最大連線數配置
    mysql -uroot -p
    #輸入mysql root 使用者密碼
    show variables like '%max_connections%';
    #檢視mysql 最大連線數  (我3.10 機器預設配置是151 這裡我把它改成256)
    set GLOBAL max_connections=256;
    #再檢視是否修改成功
    show variables like '%max_connections%';

  • go程式碼實現
    package appservice
    
    import (
        "gormdemo/models"
        "sync
    " "time" "gorm.io/driver/mysql" "gorm.io/gorm" ) const stopTimeout = time.Second * 10 const dsn = "root:123456@tcp(192.168.3.10:3306)/go_testdb?charset=utf8mb4&parseTime=True&loc=Local" var ( once sync.Once db *gorm.DB ) func openDbConnection() *gorm.DB { db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) sqlDB, err :
    = db.DB() sqlDB.SetMaxIdleConns(10) //空閒連線數 sqlDB.SetMaxOpenConns(100)//最大連線數 sqlDB.SetConnMaxLifetime(time.Minute) if err != nil { panic("連線資料庫失敗!") } return db } func init() { db = openDbConnection() // migration db.AutoMigrate(&models.User{}) } // 建立使用者 func Create(user *models.User) {
    if user == nil { panic("使用者不存在!") } else { result := db.Create(user) if result.Error != nil && result.RowsAffected == 0 { panic("新增失敗:" + result.Error.Error()) } } } // 更新使用者 func Update(user *models.User) bool { if user == nil { panic("使用者不存在!") } else { // 查最新的使用者 var existUser models.User result := db.Where("email = ?", *user.Email).First(&existUser) if result.RowsAffected > 0 { existUser.Name = user.Name existUser.Age = user.Age existUser.Email = user.Email existUser.Birthday = user.Birthday db.Save(&existUser) } else { panic("使用者不存在!") } } return true } // 獲取使用者 func Get(id uint) *models.User { var user models.User db.First(&user, id) return &user } // 刪除使用者 func Delete(id uint) bool { db.Delete(&models.User{}, id) return true } // 獲取所有使用者 func GetUserAll() *[]models.User { var users []models.User result := db.Select([]string{}).Find(&users) if result.RowsAffected > 0 { return &users } return nil }

  • 核心程式碼在openDbConnection方法內的最大連線數設定。 這裡預設值是0 (也就是不做任何限制), 如果不根據服務端的最大連線數設定的話,併發起來的時候可能會報Too many connections
  • 還有根據測算這裡的最大連線數並不是設定的越大越好的。根據伺服器的配置進行相應的設定才能使得吞吐量最大化。