gf
gf copied to clipboard
设置多个数据库报错
写了一个数据同步小工具,每次运行时有50%的概率会出现这个报错
2022/04/21 14:27:09 sync_goods.go:121: dial tcp 127.0.0.1:3306: connectex: Only one usage of each socket address (protocol/network address/port) is normally permitted., SELECT * FROM `a_goods_option` WHERE `goodsid`=200
2022/04/21 14:27:09 sync_goods.go:121: dial tcp 127.0.0.1:3306: connectex: Only one usage of each socket address (protocol/network address/port) is normally permitted., SELECT * FROM `a_goods_param` WHERE `goodsid`=200
2022/04/21 14:27:09 sync_goods.go:121: dial tcp 127.0.0.1:3306: connectex: Only one usage of each socket address (protocol/network address/port) is normally permitted., SELECT * FROM `a_goods_spec` WHERE `goodsid`=200
2022/04/21 14:27:09 sync_goods.go:121: dial tcp 127.0.0.1:3306: connectex: Only one usage of each socket address (protocol/network address/port) is normally permitted., SELECT * FROM `a_goodscode_good` WHERE `goodsid`=200
下面是数据库配置
# 数据库连接配置
database:
logger:
path: "logs/sql"
level: "all"
stdout: false
ctxKeys: ["RequestId"]
default:
type: "mysql"
host: "127.0.0.1"
port: "3306"
user: "root"
pass: "root"
name: "testa"
prefix: "a_"
role: "master"
debug: true
Weight: 1
MaxIdleConnCount: 5
MaxOpenConnCount: 20
MaxConnLifetime: 120
mall:
type: "mysql"
host: "127.0.0.1"
port: "3306"
user: "root"
pass: "root"
name: "testb"
prefix: "a_"
role: "master"
debug: true
Weight: 2
MaxIdleConnCount: 5
MaxOpenConnCount: 20
MaxConnLifetime: 120
以下是报错代码片段
var AdDb = g.DB("default")
var MaDb = g.DB("mall")
for{
...
list_form, err := AdDb.Ctx(ctx).Model(a.getTableName(table_name)).Where(key, id).All()
list_to, err := MaDb.Ctx(ctx).Model(a.getTableName(table_name)).Where(key, id).All()
...
}
dial tcp 127.0.0.1:3306: connectex: Only one usage of each socket address (protocol/network address/port) is normally permitted 说明你本地的服务连接被打满导致的不可用,可尝试使用 netstat -ano
查看使用中的端口,并合理设置连接池相关参数,详细可参考 ORM使用配置
初步看了下,不知道什么原因。看起来像是连接池失效了一样,需要调试一下,定时异步打印一下连接池的状态?或者异步观测下数据库的连接状态? 另外需要注意一点,连接池是按照数据库设置的,不同的数据库连接池是独立的。