国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Golang1.7.4標準庫sql使用

2019-11-14 09:59:14
字體:
來源:轉載
供稿:網友
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"http://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, err := sql.Open("mysql", 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, args...) } return nil, err } } return rows, err } return nil, 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}
上一篇:堆結構

下一篇:codevs 1361_知識排名_模擬

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 南丰县| 关岭| 平邑县| 贺州市| 沾益县| 大冶市| 正镶白旗| 青铜峡市| 彰化市| 西藏| 涿鹿县| 洛浦县| 怀集县| 兖州市| 高邑县| 遂宁市| 定西市| 无棣县| 兰州市| 大庆市| 报价| 穆棱市| 蓝田县| 叶城县| 石门县| 措勤县| 信阳市| 上高县| 科技| 股票| 田阳县| 息烽县| 新民市| 寻甸| 宁城县| 仁化县| 涟源市| 望江县| 井研县| 镇江市| 赤峰市|