golang实现一个简单的mysql连接池

import (
	"database/sql"
	"errors"
	"log"
	"time"

	_ "github.com/go-sql-driver/mysql"
)

var ConnPoll chan *Conn
var maxIdleConns = 10 // 最大空闲
var maxIdleTime = 10  // 最大空闲时间,10s
var maxOpenConns = 20 // 最大连接数

const (
	host = "xxxxxx"
	user = "xxxxxx"
	pass = "xxxxxx"
	db   = "xxxxxx"
)

type Conn struct {
	conn    *sql.DB
	lastUse time.Time
}

func addConn(conn *Conn) {
	if ConnPoll == nil {
		ConnPoll = make(chan *Conn, maxOpenConns)
	}
	if len(ConnPoll) >= maxOpenConns {
		conn.conn.Close()
		return
	}
	ConnPoll <- conn
}

func initDB() {
	if len(ConnPoll) == 0 {
		ConnPoll = make(chan *Conn, maxOpenConns)
		for i := 0; i < maxOpenConns/2; i++ {
			db, err := sql.Open("mysql", user+":"+pass+"@tcp("+host+":3306)/"+db+"?charset=utf8")
			if err != nil {
				log.Println(err)
			}
			addConn(&Conn{conn: db})
		}
	}
}

func GetConn() (conn *Conn, err error) {
	if ConnPoll == nil || len(ConnPoll) == 0 {
		initDB()
	}

	// 获取连接,超时控制
	select {
	case <-time.After(time.Second * time.Duration(3)):
		err = errors.New("timeout")
	case conn = <-ConnPoll:

	}

	return conn, nil
}

主要使用channel来实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值