github.com/lingyao2333/mo-zero@v1.4.1/core/stores/sqlx/sqlmanager.go (about) 1 package sqlx 2 3 import ( 4 "database/sql" 5 "io" 6 "sync" 7 "time" 8 9 "github.com/lingyao2333/mo-zero/core/syncx" 10 ) 11 12 const ( 13 maxIdleConns = 64 14 maxOpenConns = 64 15 maxLifetime = time.Minute 16 ) 17 18 var connManager = syncx.NewResourceManager() 19 20 type pingedDB struct { 21 *sql.DB 22 once sync.Once 23 } 24 25 func getCachedSqlConn(driverName, server string) (*pingedDB, error) { 26 val, err := connManager.GetResource(server, func() (io.Closer, error) { 27 conn, err := newDBConnection(driverName, server) 28 if err != nil { 29 return nil, err 30 } 31 32 return &pingedDB{ 33 DB: conn, 34 }, nil 35 }) 36 if err != nil { 37 return nil, err 38 } 39 40 return val.(*pingedDB), nil 41 } 42 43 func getSqlConn(driverName, server string) (*sql.DB, error) { 44 pdb, err := getCachedSqlConn(driverName, server) 45 if err != nil { 46 return nil, err 47 } 48 49 pdb.once.Do(func() { 50 err = pdb.Ping() 51 }) 52 if err != nil { 53 return nil, err 54 } 55 56 return pdb.DB, nil 57 } 58 59 func newDBConnection(driverName, datasource string) (*sql.DB, error) { 60 conn, err := sql.Open(driverName, datasource) 61 if err != nil { 62 return nil, err 63 } 64 65 // we need to do this until the issue https://github.com/golang/go/issues/9851 get fixed 66 // discussed here https://github.com/go-sql-driver/mysql/issues/257 67 // if the discussed SetMaxIdleTimeout methods added, we'll change this behavior 68 // 8 means we can't have more than 8 goroutines to concurrently access the same database. 69 conn.SetMaxIdleConns(maxIdleConns) 70 conn.SetMaxOpenConns(maxOpenConns) 71 conn.SetConnMaxLifetime(maxLifetime) 72 73 return conn, nil 74 }