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  }