我用db连接器实现了单例。 它工作正常,但我无法理解LOCK( mutex.Lock())在做什么。
我试图理解这一点,但是也许有人可以告诉我更多有关此的信息。
我这样理解-> 使用Lock()之后,只需一个goroutine即可运行Lock和Unlock之间的整个代码。 如果这是事实,那不是瓶颈吗?这不是让我的应用程序变慢太多吗?每个gorutine必须等待另一端执行此代码。
package singleton
import (
"database/sql"
"fmt"
"sync"
)
var connector *sql.DB
var mutex = &sync.Mutex{}
func OpenConnection() *sql.DB {
if connector == nil {
mutex.Lock()
defer mutex.Unlock()
if connector == nil {
fmt.Println("Creating Single Instance Now")
var err error
connector,err = sql.Open("mysql","db_user:.db_password@/books")
if err != nil {
panic(err)
}
}
}
return connector
}
package server
import (
"connection/singleton"
"database/sql"
_ "github.com/go-sql-driver/mysql"
"strings"
)
var connector *sql.DB
func SelectQuery(query string) (*sql.Rows,error) {
connector = singelton.OpenConnection()
query = strings.ToLower(query)
if !strings.Contains(query,"select") {
panic("Can't use select query to run different query")
}
results,err := connector.Query(query)
if err != nil {
panic(err.Error()) // proper error handling instead of panic in your app
}
return results,err
}