xorm/pool.go

82 lines
1.9 KiB
Go

package xorm
import (
"database/sql"
"fmt"
//"sync"
"sync/atomic"
//"time"
)
type IConnectionPool interface {
RetrieveDB(engine *Engine) (*sql.DB, error)
ReleaseDB(engine *Engine, db *sql.DB)
}
type NoneConnectPool struct {
}
var ConnectionNum int32 = 0
func (p NoneConnectPool) RetrieveDB(engine *Engine) (db *sql.DB, err error) {
atomic.AddInt32(&ConnectionNum, 1)
db, err = engine.OpenDB()
fmt.Printf("--open a connection--%x\n", &db)
return
}
func (p NoneConnectPool) ReleaseDB(engine *Engine, db *sql.DB) {
atomic.AddInt32(&ConnectionNum, -1)
fmt.Printf("--close a connection--%x\n", &db)
db.Close()
}
/*type SimpleConnectPool struct {
releasedSessions []*sql.DB
cur int
usingSessions map[*sql.DB]time.Time
maxWaitTimeOut int
mutex *sync.Mutex
}
func (p SimpleConnectPool) RetrieveDB(engine *Engine) (*sql.DB, error) {
p.mutex.Lock()
defer p.mutex.Unlock()
var db *sql.DB = nil
var err error = nil
fmt.Printf("%x, rbegin - released:%v, using:%v\n", &p, p.cur+1, len(p.usingSessions))
if p.cur < 0 {
ConnectionNum = ConnectionNum + 1
fmt.Printf("new %v\n", ConnectionNum)
db, err = engine.OpenDB()
if err != nil {
return nil, err
}
p.usingSessions[db] = time.Now()
} else {
db = p.releasedSessions[p.cur]
p.usingSessions[db] = time.Now()
p.releasedSessions[p.cur] = nil
p.cur = p.cur - 1
fmt.Println("release one")
}
fmt.Printf("%x, rend - released:%v, using:%v\n", &p, p.cur+1, len(p.usingSessions))
return db, nil
}
func (p SimpleConnectPool) ReleaseDB(engine *Engine, db *sql.DB) {
p.mutex.Lock()
defer p.mutex.Unlock()
fmt.Printf("%x, lbegin - released:%v, using:%v\n", &p, p.cur+1, len(p.usingSessions))
if p.cur >= 29 {
ConnectionNum = ConnectionNum - 1
db.Close()
} else {
p.cur = p.cur + 1
p.releasedSessions[p.cur] = db
}
delete(p.usingSessions, db)
fmt.Printf("%x, lend - released:%v, using:%v\n", &p, p.cur+1, len(p.usingSessions))
}*/