美文网首页Go浪
golang 数据库连接池

golang 数据库连接池

作者: Nick_4438 | 来源:发表于2020-10-23 07:13 被阅读0次

简介

本文介绍如何使用gorm 2 连接池的使用代码例子,该连接池支持Mysql、postgres、sqlite三种数据库。

安装依赖

go get gorm.io/gorm
go get gorm.io/driver/mysql
go get gorm.io/driver/postgres
go get gorm.io/driver/sqlite

数据库配置文件

  • 配置文件
{
  "database": {
    "name": "db1",
    "password": "123456",
    "user": "root",
    "type": "mysql",
    "host": "127.0.0.1",
    "port": "3306",
    "table_prefix": ""
  }
}
  • 读取配置文件代码
package config

import (
    "encoding/json"
    "os"
)

// Config 配置对象
type Config struct {
    Database *Database `json:"database"`
}

// GlobalConfigSetting 配置实例
var GlobalConfigSetting = &Config{}

// Setup 配置
func Setup() {
    filePtr, err := os.Open("config/config.json") //config的文件目录
    if err != nil {
        return
    }
    defer filePtr.Close()
    // 创建json解码器
    decoder := json.NewDecoder(filePtr)
    err = decoder.Decode(GlobalConfigSetting)
    DatabaseSetting = GlobalConfigSetting.Database

}

// Database 数据库配置对象
type Database struct {
    Type        string `json:"type"`
    User        string `json:"user"`
    Password    string `json:"password"`
    Host        string `json:"host"`
    Port        string `json:"port"`
    Name        string `json:"name"`
    TablePrefix string `json:"table_prefix"`
}

// DatabaseSetting 数据库配置对象 实例
var DatabaseSetting = &Database{}

连接池代码

package dao

import (
    "fmt"
    "log"
    "report/src/config"
    "time"

    "gorm.io/driver/mysql"
    "gorm.io/driver/postgres"
    "gorm.io/driver/sqlite"
    "gorm.io/gorm"
)

// db连接
var db *gorm.DB

// Setup 初始化连接
func Setup() {
    // db = newConnection()
    var dbURI string
    var dialector gorm.Dialector
    if config.DatabaseSetting.Type == "mysql" {
        dbURI = fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8&parseTime=true",
            config.DatabaseSetting.User,
            config.DatabaseSetting.Password,
            config.DatabaseSetting.Host,
            config.DatabaseSetting.Port,
            config.DatabaseSetting.Name)
        dialector = mysql.New(mysql.Config{
            DSN:                       dbURI, // data source name
            DefaultStringSize:         256,   // default size for string fields
            DisableDatetimePrecision:  true,  // disable datetime precision, which not supported before MySQL 5.6
            DontSupportRenameIndex:    true,  // drop & create when rename index, rename index not supported before MySQL 5.7, MariaDB
            DontSupportRenameColumn:   true,  // `change` when rename column, rename column not supported before MySQL 8, MariaDB
            SkipInitializeWithVersion: false, // auto configure based on currently MySQL version
        })
    } else if config.DatabaseSetting.Type == "postgres" {
        dbURI = fmt.Sprintf("host=%s port=%s user=%s dbname=%s sslmode=disable password=%s",
            config.DatabaseSetting.Host,
            config.DatabaseSetting.Port,
            config.DatabaseSetting.User,
            config.DatabaseSetting.Name,
            config.DatabaseSetting.Password)
        dialector = postgres.New(postgres.Config{
            DSN:                  "user=gorm password=gorm dbname=gorm port=9920 sslmode=disable TimeZone=Asia/Shanghai",
            PreferSimpleProtocol: true, // disables implicit prepared statement usage
        })
    } else { // sqlite3
        dbURI = fmt.Sprintf("test.db")
        dialector = sqlite.Open("test.db")
    }
    conn, err := gorm.Open(dialector, &gorm.Config{})
    if err != nil {
        log.Print(err.Error())
    }
    sqlDB, err := conn.DB()
    if err != nil {
        fmt.Error("connect db server failed.")
    }
    sqlDB.SetMaxIdleConns(10)                   // SetMaxIdleConns sets the maximum number of connections in the idle connection pool.
    sqlDB.SetMaxOpenConns(100)                  // SetMaxOpenConns sets the maximum number of open connections to the database.
    sqlDB.SetConnMaxLifetime(time.Second * 600) // SetConnMaxLifetime sets the maximum amount of time a connection may be reused.
    db = conn
}

// GetDB 开放给外部获得db连接
func GetDB() *gorm.DB {
    sqlDB, err := db.DB()
    if err != nil {
        fmt.Errorf("connect db server failed.")
        Setup()
    }
    if err := sqlDB.Ping(); err != nil {
        sqlDB.Close()
        Setup()
    }

    return db
}

使用示例

package domain

import (
    "report/src/dao"

    "gorm.io/gorm"
)

// Product 产品
type Product struct {
    gorm.Model
    Code  string
    Price uint
}

// Test 测试
func (Product) Test() {
    db := dao.GetDB()
    // 自动迁移模式
    db.AutoMigrate(&Product{})

    // 创建
    db.Create(&Product{Code: "L1212", Price: 1000})

}

相关文章

  • java基础-day36-数据库连接池和HTML

    数据库连接池和HTML 1. 数据库连接池 1.1 为什么要使用数据库连接池 1.2 数据库连接池考虑的问题 1....

  • 撩课-JavaWeb之什么是连接池与连接池使用

    什么是连接池 没有连接池的情况 数据库连接池 池 连接池 作用 数据库连接池 示意图 连接池中的属性 连接池使用 ...

  • JDBC Druid数据库连接池

    Druid数据库连接池 使用Druid数据库连接池技术

  • 《深入浅出MySQL》23章<应用优化>读书笔记

    1:使用数据库连接池 什么是数据库连接池?数据库连接池(Connection pooling)是 程序启动时 建立...

  • 5. go 连接池

    redis 连接池说明: 说明:通过 golang 对redis 操作,还可以通过redis 连接池,流程如下: ...

  • 数据库连接池,wtforms的使用

    目录 数据库连接池pymsql链接数据库数据库连接池版 wtforms的使用使用1使用2 16.数据库连接池 py...

  • 数据库连接池的设置

    数据库连接池 几乎所有的商业应用都有大量数据库访问,通常这些应用会采用数据库连接池。理解为什么需要连接池,连接池的...

  • DBCP

    分类说明名称DBCP全称Database Connection Pool功能数据库连接池 连接池 数据库连接池是一...

  • golang 数据库连接池

    简介 本文介绍如何使用gorm 2 连接池的使用代码例子,该连接池支持Mysql、postgres、sqlite三...

  • 数据库连接池

    使用数据库连接池优化程序性能 编写数据库连接池 编写连接池需事先java.sql.DataSource接口。Dat...

网友评论

    本文标题:golang 数据库连接池

    本文链接:https://www.haomeiwen.com/subject/arvmmktx.html