go创建一个连接池
来源:互联网 发布:机器人离线编程 编辑:程序博客网 时间:2024/06/03 08:01
连接池
1 需要注册连接的方法2 连接必须实现关闭方法3 运行注册pool 4 是否关闭5 写连接池和关闭的时候加锁6 接口的实现是区分*和非*的
具体实现代码
package workpoolimport ( "errors" "io" "log" "sync")//创建连接的接口type createConection interface { CreateConnect() (io.Closer, error)}//一个pooltype ConectPool struct { closeChan chan io.Closer factory createConection isClose bool mutex sync.Mutex}//新建一个poolfunc NewConnectPool(poolSize int, factory createConection) (*ConectPool, error) { if poolSize < 0 { return nil, errors.New("pool size < 0") } return &ConectPool{ closeChan: make(chan io.Closer, poolSize), factory: factory, isClose: false, }, nil}//获取连接func (cp *ConectPool) GetConnect() (io.Closer, error) { select { case connect, ok := <-cp.closeChan: if !ok { return nil, errors.New("closeChan is closed") } log.Println("fetch connect sucessed") return connect, nil default: log.Println("fetch connect faild,create a new one") return cp.factory.CreateConnect() }}//把一个连接放入池子func (cp *ConectPool) PutConnect(aConnection io.Closer) { cp.mutex.Lock() defer cp.mutex.Unlock() if cp.isClose == true { return } select { case cp.closeChan <- aConnection: log.Println("put connection into the closer!") default: log.Println("put faild.close connection!") aConnection.Close() }}//关闭连接func (cp *ConectPool) Close() { cp.mutex.Lock() defer cp.mutex.Unlock() if cp.isClose != true { cp.isClose = true } close(cp.closeChan) for aConnect := range cp.closeChan { aConnect.Close() }}
测试例子
//创建一个connectvar connectId int32 = 0type DbConnect struct { cid int32}func (db *DbConnect) getConnectId() int32 { return db.cid}func (db *DbConnect) Close() error { return nil}//创建连接type DbConnectCreater struct{}func (dbc *DbConnectCreater) CreateConnect() (io.Closer, error) { id := atomic.AddInt32(&connectId, 1) return &DbConnect{cid: id}, nil}func tpool3() { fmt.Println("test connect pool3") creater := &DbConnectCreater{} pool3, err := workpool.NewConnectPool(10, creater) if err != nil { log.Println("create faild") } defer pool3.Close() //放入10个连接 for i := 0; i < 10; i++ { conect, err := creater.CreateConnect() if err == nil { pool3.PutConnect(conect) } } for i := 0; i < 12; i++ { connect, err := pool3.GetConnect() if err == nil { log.Println("connect_id=", connect.(*DbConnect).getConnectId()) } }}
具体可以看这个 https://github.com/beckbikang/go_pool
阅读全文
0 0
- go创建一个连接池
- 使用GO语言创建一个Web应用
- 如何创建一个数据库连接池
- 创建一个tcp连接
- 如何创建一个VPN连接
- 如何创建一个VPN连接
- 为Go Web App 创建一个主页面
- Go中使用MySQL连接池
- ATC:go Thrift RPC 使用 (连接池)
- 如何创建一个有效的连接字符串
- 创建一个远程桌面连接的快捷方式
- Flex - 使SQLite只创建一个连接
- SAE MYSQL 连接实例(创建一个表)
- PHP连接数据库并创建一个表
- WEBLOGIC创建连接池
- 连接池的创建
- Java 创建连接池
- Redigo--Go连接Redis
- MySQL 视图
- java环境变量配置详细
- 过河问题
- JQuery选择器
- 第十三天 函数(高阶和匿名)
- go创建一个连接池
- Matlab2017 安装alexnet
- 字符串对象的创建问题
- 第14期《成长之路》2017年11月刊
- PAT (Basic Level) Practise (中文)1023. 组个最小数 (20)
- Netty源码分析:read
- 与高德地图的一些恩怨(一)定位
- 04:运算符
- SLF4J: Class path contains multiple SLF4J bindings