max_idle_conns = 5
max_open_conns = 30
max_life_time = 600
超时= 600
+-----------------------------+----------+
| Variable_name | Value |
+-----------------------------+----------+
| connect_timeout | 60 |
| delayed_insert_timeout | 300 |
| interactive_timeout | 600 |
| lock_wait_timeout | 31536000 |
| log_output | FILE |
| net_read_timeout | 30 |
| net_write_timeout | 60 |
| wait_timeout | 600 |
+-----------------------------+----------+
srv_promo 12672 root 10u sock 0,6 0t0 63382668无法识别协议
srv_promo 12672 root 11u sock 0,6 0t0 63366850无法识别协议
srv_promo 12672 root 12u sock 0,6 0t0 63366688无法识别协议
srv_promo 12672 root 13u sock 0,6 0t0 63366690无法识别协议
下面的package dbtest
import (
"database/sql"
"fmt"
"github.com/golang/glog"
"gopkg.in/gorp.v2"
"log"
"os"
"sync"
"time"
)
type DatabaseConfig struct {
DBName string `toml:"dbname"`
Host string `toml:"host"`
Port int `toml:"port"`
User string `toml:"user"`
Password string `toml:"password"`
Sslmode string `toml:"sslmode"`
ShowLog bool
DataSaveDir string
DataFileSaveLoopSize int
MaxIdleConns int `toml:"max_idle_conns"`
MaxOpenConns int `toml:"max_open_conns"`
MaxLifeTime int `toml:"max_life_time"`
Timeout int `toml:"timeout"`
RTimeout int `toml:"rtimeout"`
WTimeout int `toml:"wtimeout"`
}
func (c DatabaseConfig) MySQLSource() string {
params := make(map[string]string, 0)
params["charset"] = "utf8mb4"
cfg := mysql.Config{}
cfg.User = c.User
cfg.Passwd = c.Password
cfg.DBName = c.DBName
cfg.ParseTime = true
cfg.Collation = "utf8mb4_unicode_ci"
cfg.Params = params
cfg.Loc, _ = time.LoadLocation("Asia/Chongqing")
cfg.Timeout = time.Duration(c.Timeout) * time.Second
cfg.MultiStatements = true
cfg.ReadTimeout = time.Duration(c.RTimeout) * time.Second
cfg.WriteTimeout = time.Duration(c.WTimeout) * time.Second
return cfg.FormatDSN()
}
var (
dbmap *gorp.DbMap
Dbm *gorp.DbMap
config DatabaseConfig
opened bool
openMutex sync.RWMutex
DB *sql.DB
)
//Open open the database for passport with config
func Open(cfg DatabaseConfig) {
if !opened {
config = cfg
db, err := sql.Open("mysql", config.MySQLSource())
glog.Infof("open err %v ", err)
if err != nil {
panic(fmt.Errorf("sql.Open failed: %v", err))
}
if config.MaxLifeTime > 0 {
db.SetConnMaxLifetime(time.Duration(config.MaxLifeTime) * time.Second)
}
db.SetMaxIdleConns(config.MaxIdleConns)
db.SetMaxOpenConns(config.MaxOpenConns)
db.Ping()
DB = db
// construct a gorp DbMap
dbmap = &gorp.DbMap{Db: db, Dialect: gorp.MySQLDialect{"InnoDB", "utf8mb4"}}
Dbm = dbmap
err = dbmap.CreateTablesIfNotExists()
if err != nil {
panic("create table failed " + err.Error())
}
openMutex.Lock()
opened = true
openMutex.Unlock()
if config.ShowLog {
dbmap.TraceOn("[gorp]", log.New(os.Stdout, schemaName+" ", log.Lmicroseconds))
}
}
}
//Close close the database for passport
func Close() {
if dbmap != nil && opened {
glog.Infof("close database %s for %s", config.DBName, schemaName)
dbmap.Db.Close()
openMutex.Lock()
opened = false
openMutex.Unlock()
}
}
答案 0 :(得分:0)
(不是答案,但评论太多了。)
两件事:
请尝试提出一个MCVE - 首先是自己和第二个(如果单凭这一点不能帮助您解决问题) - 对我们而言。
我的意思是,您的示例中有太多内容:您使用的gorp
不是Go标准库的一部分,而且这个包 - 据称是在使用数据库时,包装database/sql
machinery- 可以完成任何。
这不是如何处理这些问题的。
相反,你应该从头开始并首次使用
普通database/sql
图层,看它是否有效。
如果是这样,问题在于gorp
。
另一个很小的细节是你不应该使用
第三方包在你的MCVE中做琐碎的事情;
在这里,我谈的是日志记录:在一个简单的例子中,
标准fmt.Print*
函数就可以了,或者,
如果你觉得不可能全面开展企业,
标准log
包将填写账单。
Go中的SQL数据库层明确设计为 具有与SQL数据库层完全不同的语义 由其他流行语言/框架实现。
Go的不同之处在于它旨在处理大量 通常在服务器软件上生成的工作负载。 除其他外,它意味着
Ping()
方法)。