Golang1.7.4标准库sql使用

Golang1.7.4标准库sql使用,第1张

概述package mainimport ( "database/sql" "errors" "fmt" "net" "sync/atomic" "time" "github.com/go-sql-driver/mysql")func main() {}//新建mysql连接,connstr为mysql连接串"root:12345
package mainimport (    "database/sql"    "errors"    "fmt"    "net"    "sync/atomic"    "time"    "github.com/go-sql-driver/MysqL")func main() {}//新建MysqL连接,connstr为MysqL连接串"root:123456@tcp(172.18.80.211:3306)/workstacks?charset=utf8"//maxopen为最大连接数func NewMysqL(connstr string,maxopen int) (*_MysqL,error) {    m := &_MysqL{connstr: connstr,maxopen: maxopen}    err := m.dial()    return m,err}var UnavailableError = errors.New("Status Unavailable")type _MysqL struct {    connstr string    maxopen int    db      *sql.DB    status  uint32}//初始化连接串func (s *_MysqL) init() error {    db,err := sql.Open("MysqL",s.connstr)    if err != nil {        return err    }    if s.maxopen <= 0 {        db.SetMaxOpenConns(20)    } else {        db.SetMaxOpenConns(s.maxopen)    }    s.db = db    return nil}//连接数据库,当网络不可达的时候会循环连接,知道连接成功,每次连接等待时间会递增,最大等待时间为120sfunc (s *_MysqL) dial() error {    if s.db == nil {        err := s.init()        if err != nil {            return err        }    }    var rtime time.Duration = 10redial:    err := s.db.Ping()    if err != nil {        if _,ok := err.(*MysqL.MysqLError); ok {            return err        }        if isNetError(err) {            <-time.After(rtime * time.Second)            if rtime < 120 {                rtime += 10            }            fmt.Println(err)            goto redial        }        return err    }    s.SetStatus(1)    return nil}//重置数据库连接信息func (s *_MysqL) reset(connstr string,maxopen int) error {    db,connstr)    if err != nil {        return err    }    if maxopen <= 0 {        db.SetMaxOpenConns(20)    } else {        db.SetMaxOpenConns(maxopen)    }    err = db.Ping()    if err != nil {        return err    }    s.connstr = connstr    s.maxopen = maxopen    tmpdb := s.db    s.db = db    tmpdb.Close()    return nil}//执行SQL语句,insert,update,delete等func (s *_MysqL) Exec(query string,args ...interface{}) (sql.Result,error) {    if s.Status() {        result,err := s.db.Exec(query,args...)        if err != nil {            if isNetError(err) {                s.SetStatus(0)                if err = s.dial(); err == nil {                    return s.Exec(query,args...)                }                return nil,err            }        }        return result,err    }    return nil,UnavailableError}//执行SQL查询func (s *_MysqL) query(query string,args ...interface{}) (*sql.Rows,error) {    if s.Status() {        rows,err := s.db.query(query,args...)        if err != nil {            if isNetError(err) {                s.SetStatus(0)                if err = s.dial(); err == nil {                    return s.query(query,err            }        }        return rows,UnavailableError}//查看当前状态是否可用,返回true表示可用func (s *_MysqL) Status() bool {    return atomic.LoadUint32(&s.status) != 0}//设置状态,0表示状态不可用,1表示状态可用func (s *_MysqL) SetStatus(status uint32) {    atomic.StoreUint32(&s.status,status)}//关闭数据库连接func (s *_MysqL) Close() {    if s.db != nil {        s.db.Close()    }}func isNetError(err error) bool {    _,ok := err.(*net.OpError)    return ok}
总结

以上是内存溢出为你收集整理的Golang1.7.4标准库sql使用全部内容,希望文章能够帮你解决Golang1.7.4标准库sql使用所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1279946.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-09
下一篇2022-06-09

发表评论

登录后才能评论

评论列表(0条)

    保存