@@ -197,6 +197,7 @@ type DB struct {
197
197
dep map [finalCloser ]depSet
198
198
onConnPut map [* driverConn ][]func () // code (with mu held) run when conn is next returned
199
199
lastPut map [* driverConn ]string // stacktrace of last conn's put; debug only
200
+ maxIdle int // zero means defaultMaxIdleConns; negative means 0
200
201
}
201
202
202
203
// driverConn wraps a driver.Conn with a mutex, to
@@ -332,11 +333,45 @@ func (db *DB) Close() error {
332
333
return err
333
334
}
334
335
335
- func (db * DB ) maxIdleConns () int {
336
- const defaultMaxIdleConns = 2
337
- // TODO(bradfitz): ask driver, if supported, for its default preference
338
- // TODO(bradfitz): let users override?
339
- return defaultMaxIdleConns
336
+ const defaultMaxIdleConns = 2
337
+
338
+ func (db * DB ) maxIdleConnsLocked () int {
339
+ n := db .maxIdle
340
+ switch {
341
+ case n == 0 :
342
+ // TODO(bradfitz): ask driver, if supported, for its default preference
343
+ return defaultMaxIdleConns
344
+ case n < 0 :
345
+ return 0
346
+ default :
347
+ return n
348
+ }
349
+ }
350
+
351
+ // SetMaxIdleConns sets the maximum number of connections in the idle
352
+ // connection pool.
353
+ //
354
+ // If n <= 0, no idle connections are retained.
355
+ func (db * DB ) SetMaxIdleConns (n int ) {
356
+ db .mu .Lock ()
357
+ defer db .mu .Unlock ()
358
+ if n > 0 {
359
+ db .maxIdle = n
360
+ } else {
361
+ // No idle connections.
362
+ db .maxIdle = - 1
363
+ }
364
+ for len (db .freeConn ) > 0 && len (db .freeConn ) > n {
365
+ nfree := len (db .freeConn )
366
+ dc := db .freeConn [nfree - 1 ]
367
+ db .freeConn [nfree - 1 ] = nil
368
+ db .freeConn = db .freeConn [:nfree - 1 ]
369
+ go func () {
370
+ dc .Lock ()
371
+ dc .ci .Close ()
372
+ dc .Unlock ()
373
+ }()
374
+ }
340
375
}
341
376
342
377
// conn returns a newly-opened or cached *driverConn
@@ -441,7 +476,7 @@ func (db *DB) putConn(dc *driverConn, err error) {
441
476
if putConnHook != nil {
442
477
putConnHook (db , dc )
443
478
}
444
- if n := len (db .freeConn ); ! db .closed && n < db .maxIdleConns () {
479
+ if n := len (db .freeConn ); ! db .closed && n < db .maxIdleConnsLocked () {
445
480
db .freeConn = append (db .freeConn , dc )
446
481
db .mu .Unlock ()
447
482
return
0 commit comments