gf icon indicating copy to clipboard operation
gf copied to clipboard

设置多个数据库报错

Open tkzl opened this issue 2 years ago • 2 comments

写了一个数据同步小工具,每次运行时有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()
...
}

tkzl avatar Apr 21 '22 06:04 tkzl

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使用配置

DGuang21 avatar Apr 27 '22 13:04 DGuang21

初步看了下,不知道什么原因。看起来像是连接池失效了一样,需要调试一下,定时异步打印一下连接池的状态?或者异步观测下数据库的连接状态? 另外需要注意一点,连接池是按照数据库设置的,不同的数据库连接池是独立的。

gqcn avatar May 13 '22 12:05 gqcn