@@ -4,11 +4,7 @@ import (
4
4
"context"
5
5
"database/sql"
6
6
"strings"
7
- "sync/atomic"
8
- "time"
9
7
10
- "github.com/zeromicro/go-zero/core/logx"
11
- "github.com/zeromicro/go-zero/core/proc"
12
8
"github.com/zeromicro/go-zero/core/stores/sqlx"
13
9
"github.com/zeromicro/go-zero/core/trace"
14
10
"go.opentelemetry.io/otel/attribute"
@@ -31,17 +27,14 @@ type (
31
27
DBConf struct {
32
28
Leader string
33
29
Followers []string `json:",optional"`
34
- // BackLeader back to Leader when all Followers are not available.
35
- BackLeader bool `json:",optional"`
36
- FollowerHeartbeat time.Duration `json:",default=60s"`
37
30
}
38
31
39
32
SqlOption func (* multipleSqlConn )
40
33
41
34
multipleSqlConn struct {
42
35
leader sqlx.SqlConn
43
36
enableFollower bool
44
- p2cPicker atomic. Value // picker
37
+ p2cPicker picker // picker
45
38
followers []sqlx.SqlConn
46
39
conf DBConf
47
40
accept func (error ) bool
@@ -69,15 +62,7 @@ func NewMultipleSqlConn(driverName string, conf DBConf, opts ...SqlOption) sqlx.
69
62
opt (conn )
70
63
}
71
64
72
- conn .p2cPicker .Store (newP2cPicker (followers , conn .accept ))
73
-
74
- if conn .enableFollower {
75
- ctx , cancelFunc := context .WithCancel (context .Background ())
76
- proc .AddShutdownListener (func () {
77
- cancelFunc ()
78
- })
79
- go conn .startFollowerHeartbeat (ctx )
80
- }
65
+ conn .p2cPicker = newP2cPicker (followers , conn .accept )
81
66
82
67
return conn
83
68
}
@@ -180,7 +165,7 @@ func (m *multipleSqlConn) getQueryDB(ctx context.Context, query string) queryDB
180
165
return queryDB {conn : m .leader }
181
166
}
182
167
183
- result , err := m .p2cPicker .Load ().( picker ). pick ()
168
+ result , err := m .p2cPicker .pick ()
184
169
if err == nil {
185
170
return queryDB {
186
171
conn : result .conn ,
@@ -190,41 +175,9 @@ func (m *multipleSqlConn) getQueryDB(ctx context.Context, query string) queryDB
190
175
}
191
176
}
192
177
193
- if ! m .conf .BackLeader {
194
- return queryDB {error : err }
195
- }
196
-
197
178
return queryDB {conn : m .leader }
198
179
}
199
180
200
- func (m * multipleSqlConn ) heartbeat () {
201
- conns := make ([]sqlx.SqlConn , 0 , len (m .followers ))
202
- for i , follower := range m .followers {
203
- err := pingDB (follower )
204
- if err != nil {
205
- logx .Errorw ("follower db heartbeat failure, it will be automatically removed" , logx .Field ("err" , err ), logx .Field ("db" , i ))
206
-
207
- continue
208
- }
209
-
210
- conns = append (conns , follower )
211
- }
212
-
213
- m .p2cPicker .Store (newP2cPicker (conns , m .accept ))
214
- }
215
-
216
- func (m * multipleSqlConn ) startFollowerHeartbeat (ctx context.Context ) {
217
- ticker := time .NewTicker (m .conf .FollowerHeartbeat )
218
- for {
219
- select {
220
- case <- ctx .Done ():
221
- return
222
- case <- ticker .C :
223
- m .heartbeat ()
224
- }
225
- }
226
- }
227
-
228
181
func (m * multipleSqlConn ) startSpan (ctx context.Context ) (context.Context , oteltrace.Span ) {
229
182
tracer := trace .TracerFromContext (ctx )
230
183
ctx , span := tracer .Start (ctx , spanName , oteltrace .WithSpanKind (oteltrace .SpanKindClient ))
@@ -281,21 +234,6 @@ func (q *queryDB) query(ctx context.Context, query func(ctx context.Context, con
281
234
return query (ctx , q .conn )
282
235
}
283
236
284
- func pingDB (conn sqlx.SqlConn ) error {
285
- return pingCtxDB (context .Background (), conn )
286
- }
287
-
288
- func pingCtxDB (ctx context.Context , conn sqlx.SqlConn ) error {
289
- db , err := conn .RawDB ()
290
- if err != nil {
291
- return err
292
- }
293
-
294
- return db .PingContext (ctx )
295
- }
296
-
297
- // -------------
298
-
299
237
func WithAccept (accept func (err error ) bool ) SqlOption {
300
238
return func (conn * multipleSqlConn ) {
301
239
conn .accept = accept
0 commit comments