Kaynağa Gözat

Update 优化数据库连接

YueYunyun 2 yıl önce
ebeveyn
işleme
0cfe3319c5

+ 42 - 11
SERVER/Meter_Service/core/db/db.go

@@ -7,10 +7,12 @@ import (
 )
 
 var (
-	err  error
-	myDb *MyDB
+	err   error
+	myDbs *map[string]*MyDB
 )
 
+const defaultDb = "default"
+
 var once sync.Once
 
 type MyDB struct {
@@ -20,14 +22,17 @@ type MyDB struct {
 // OpenDb 获取数据库连接
 func OpenDb(dbFun func() *sql.DB) {
 	once.Do(func() {
-		myDb = &MyDB{DB: dbFun()}
+		myDbs = &map[string]*MyDB{}
 	})
+	myDb := NewDB(dbFun())
+	(*myDbs)[defaultDb] = myDb
 }
+
 func GetDb() *MyDB {
-	return myDb
+	return (*myDbs)[defaultDb]
 }
 func CloseDb() {
-	err := myDb.DB.Close()
+	err := (*myDbs)[defaultDb].DB.Close()
 	if err != nil {
 		return
 	} else {
@@ -35,6 +40,27 @@ func CloseDb() {
 	}
 }
 
+func OpenManyDb(key string, dbFun func() *sql.DB) {
+	once.Do(func() {
+		myDbs = &map[string]*MyDB{}
+	})
+	myDb := NewDB(dbFun())
+	(*myDbs)[key] = myDb
+}
+func GetDbByKey(key string) *MyDB {
+	return (*myDbs)[key]
+}
+func CloseManyDb() {
+	for _, v := range *myDbs {
+		err := v.DB.Close()
+		if err != nil {
+			return
+		} else {
+			panic(err)
+		}
+	}
+}
+
 // Exec 增、删、改
 func (db *MyDB) Exec(SQL string, args ...interface{}) (sql.Result, error) {
 	//DB := OpenDb().DB()
@@ -77,13 +103,18 @@ func (db *MyDB) Query(SQL string, args ...interface{}) ([]map[string]string, boo
 			panic(err)
 		}
 		for i, colName := range columns {
-			var rawValue = *(values[i].(*interface{})) //读出raw数据,类型为byte
-			//b, _ := rawValue.([]byte)
-			//v := string(b) //将raw数据转换成字符串
-			m[colName], err = utils.ToString(rawValue) //colName是键,v是值
-			if err != nil {
-				panic(err)
+			var rawValue = *(values[i].(*interface{})) //读出raw数据
+			b, ok := rawValue.([]byte)
+			var v string
+			if ok {
+				v = string(b) //将raw数据转换成字符串
+			} else {
+				v, err = utils.ToString(rawValue) //colName是键,v是值
+				if err != nil {
+					panic(err)
+				}
 			}
+			m[colName] = v
 		}
 		ret = append(ret, m) //将单行所有列的键值对附加在总的返回值上(以行为单位)
 	}

+ 4 - 49
SERVER/Meter_Service/core/db/mysql/mysql.go

@@ -24,6 +24,10 @@ func GetDb() *orm.DB {
 	return db
 }
 
+func OpenMySql() *sql.DB {
+	return openMySqlPool().DB()
+}
+
 func openMySqlPool() *orm.DB {
 	dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local",
 		config.C.Mysql.Username, config.C.Mysql.Password,
@@ -71,52 +75,3 @@ func (pool *MySqlPool) InitPool() (isSuc bool) {
 	}
 	return true
 }
-
-// Exec 增、删、改
-func Exec(SQL string, args ...interface{}) (sql.Result, error) {
-	DB := GetDb().DB()
-	ret, err := DB.Exec(SQL, args)
-	if err != nil {
-		return nil, err
-	}
-	return ret, nil
-}
-
-func Query(SQL string, args ...interface{}) ([]map[string]string, bool) { //通用查询
-	DB := GetDb().DB()
-	rows, err := DB.Query(SQL, args) //执行SQL语句,比如select * from users
-	if err != nil {
-		panic(err)
-	}
-	columns, _ := rows.Columns()            //获取列的信息
-	count := len(columns)                   //列的数量
-	var values = make([]interface{}, count) //创建一个与列的数量相当的空接口
-	for i, _ := range values {
-		var ii interface{} //为空接口分配内存
-		values[i] = &ii    //取得这些内存的指针,因后继的Scan函数只接受指针
-	}
-	ret := make([]map[string]string, 0) //创建返回值:不定长的map类型切片
-	for rows.Next() {
-		err := rows.Scan(values...)  //开始读行,Scan函数只接受指针变量
-		m := make(map[string]string) //用于存放1列的 [键/值] 对
-		if err != nil {
-			panic(err)
-		}
-		for i, colName := range columns {
-			var rawValue = *(values[i].(*interface{})) //读出raw数据,类型为byte
-			b, _ := rawValue.([]byte)
-			v := string(b) //将raw数据转换成字符串
-			m[colName] = v //colName是键,v是值
-		}
-		ret = append(ret, m) //将单行所有列的键值对附加在总的返回值上(以行为单位)
-	}
-
-	defer func(rows *sql.Rows) {
-		_ = rows.Close()
-	}(rows)
-
-	if len(ret) != 0 {
-		return ret, true
-	}
-	return nil, false
-}