
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使用所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)