Skip to content

Commit b701ef7

Browse files
committed
add post
1 parent 23b23e0 commit b701ef7

File tree

6 files changed

+42
-1
lines changed

6 files changed

+42
-1
lines changed

content/posts/cannot assign requested address in golang http client/index.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ var DefaultTransport RoundTripper = &Transport{
8686
}
8787
```
8888

89-
这里指定了最大空闲连接未100,未指定单个host的最大空闲连接。
89+
这里指定了最大空闲连接为100,未指定单个host的最大空闲连接。
9090

9191
```
9292
func (t *Transport) maxIdleConnsPerHost() int {
115 KB
Loading
76.3 KB
Loading
57 KB
Loading
67.1 KB
Loading
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
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创建一个新连接,同时将此连接关闭。

0 commit comments

Comments
 (0)