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
  • 還有根據測算這里的最大連接數並不是設置的越大越好的。根據服務器的配置進行相應的設置才能使得吞吐量最大化。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM