package common_db import ( "context" "git.shuncheng.lu/bigthing/gocommon/pkg/conf" "git.shuncheng.lu/bigthing/gocommon/pkg/internal/properties" "git.shuncheng.lu/bigthing/gocommon/pkg/internal/util" "git.shuncheng.lu/bigthing/gocommon/pkg/trace" "sync" "testing" "time" ) type UserInfo struct { Id uint64 `xorm:"pk autoincr id"` UserId uint64 `xorm:"user_id"` UserName string `xorm:"user_name"` IdCard string `xorm:"id_card"` Gender uint8 `xorm:"gender"` CreateTime time.Time `xorm:"created create_time"` UpdateTime time.Time `xorm:"updated update_time"` } func (*UserInfo) TableName() string { return "user_info" } // docker run -d --rm --name mysql -m 512m -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci var ( mysqlConfig = ` mysql.host=localhost mysql.port=3306 mysql.user=root mysql.password=123456 mysql.dbname=gocommon mysql.slave_host=localhost mysql.slave_port=3306 mysql.slave_user=root mysql.slave_password=123456 mysql.slave_dbname=gocommon mysql.log_file=/data/log/gocommon/gocommon_mysql.log mysql.refresh_config_time=1 mysql.read_timeout=1 mysql.write_timeout=1 mysql.timeout=1 # trace trace.sky_walking_host = localhost:11800 trace.application_name = gocommon_dev ` ) func initConfig(t testing.TB) properties.Properties { config, err := properties.ReadFromString(mysqlConfig) if err != nil { t.Fatal(err) } conf.MustValue = func(section, key string, defaultVal ...string) string { return config.GetString(section+"."+key, defaultVal...) } return config } func TestNewDbConn(t *testing.T) { config := initConfig(t) conn, err := NewDbConn("mysql") if err != nil { t.Fatal(err) } wg := sync.WaitGroup{} wg.Add(2) // 启动后修改配置 host util.GoWithRecover(func() { defer wg.Done() <-time.After(time.Second * 2) config.SetString("mysql.slave_host", "127.0.0.2") }, nil) // 10s查询db util.GoWithRecover(func() { defer wg.Done() for x := 0; x < 10; x++ { <-time.After(time.Second) info := new(UserInfo) if _, err := conn.NewSlaveCtxSession(context.Background()).Where("id=?", 1).Get(info); err != nil { t.Fatal(err) } } }, nil) wg.Wait() } func TestTraceDb(t *testing.T) { initConfig(t) if err := trace.Init(); err != nil { t.Fatal(err) } conn, err := NewDbConn("mysql") if err != nil { t.Fatal(err) } ctx, span := trace.MockContext(context.Background(), "test") defer func() { span.End() time.Sleep(time.Second * 5) }() t.Log(trace.GetTraceId(ctx)) list := make([]UserInfo, 0) if err := conn.NewSlaveCtxSession(ctx).Find(&list); err != nil { t.Fatal(err) } t.Logf("RESULT: %v", list) }