File tree Expand file tree Collapse file tree 6 files changed +42
-1
lines changed
cannot assign requested address in golang http client
golang database sql auto reconnect mechanism Expand file tree Collapse file tree 6 files changed +42
-1
lines changed Original file line number Diff line number Diff line change @@ -86,7 +86,7 @@ var DefaultTransport RoundTripper = &Transport{
86
86
}
87
87
```
88
88
89
- 这里指定了最大空闲连接未100 ,未指定单个host的最大空闲连接。
89
+ 这里指定了最大空闲连接为100 ,未指定单个host的最大空闲连接。
90
90
91
91
```
92
92
func (t *Transport) maxIdleConnsPerHost() int {
Original file line number Diff line number Diff line change
1
+ ---
2
+ title : " Golang database/sql 数据库断线自动重连机制解析"
3
+ date : 2025-04-30T17:37:23+08:00
4
+ draft : false
5
+ tags :
6
+ - golang
7
+ - database/sql
8
+ ---
9
+
10
+ 最近有个交接服务的数据库要升级版本,升级最后切换瞬间会有一个闪断。
11
+
12
+ 这里业务侧需要确保有自动重连机制,否则会影响服务。
13
+
14
+ 因为是交接的服务,得通过代码再确认一下。
15
+
16
+ 业务代码里使用了xorm包操作的数据库,连接池管理是底层database/sql负责的。
17
+
18
+ 读了一遍代码,总算搞清楚这里断连自动重连的机制了:
19
+
20
+ xorm对外的增删改查方法最终都会调用到了exec方法,[ 代码出处] ( https://github.com/go-xorm/xorm/blob/f39e5d9bfdb70c435f8649555f224c0fa4f51e54/session_raw.go#L152 ) 。
21
+
22
+ ![ ] ( 17459087308178.png )
23
+
24
+ 可以看到这里调到了database/sql里的ExecContext方法,[ 代码出处] ( https://cs.opensource.google/go/go/+/refs/tags/go1.18:src/database/sql/sql.go ) 。
25
+
26
+ ![ ] ( 17459153468139.png )
27
+
28
+ 这里调用到了exec方法:
29
+
30
+ 1 . db.conn 从连接池获取连接;
31
+ 2 . db.execDC 执行sql,最后会通过release方法将连接再放回连接池;
32
+
33
+ 这里release传入的是db.releaseConn方法,实现如图:
34
+
35
+ ![ ] ( 17459153819395.png )
36
+
37
+ 这里调用了putConn方法,实现如图:
38
+
39
+ ![ ] ( 17459154175309.png )
40
+
41
+ 注意红框部分,这里检查执行结果如果为连接错误,会通过maybeOpenNewConnections创建一个新连接,同时将此连接关闭。
You can’t perform that action at this time.
0 commit comments