@@ -314,6 +314,52 @@ func (p *connPool) reaper() {
314314//------------------------------------------------------------------------------
315315
316316type singleConnPool struct {
317+ cn * conn
318+ }
319+
320+ func newSingleConnPool (cn * conn ) * singleConnPool {
321+ return & singleConnPool {
322+ cn : cn ,
323+ }
324+ }
325+
326+ func (p * singleConnPool ) First () * conn {
327+ return p .cn
328+ }
329+
330+ func (p * singleConnPool ) Get () (* conn , error ) {
331+ return p .cn , nil
332+ }
333+
334+ func (p * singleConnPool ) Put (cn * conn ) error {
335+ if p .cn != cn {
336+ panic ("p.cn != cn" )
337+ }
338+ return nil
339+ }
340+
341+ func (p * singleConnPool ) Remove (cn * conn ) error {
342+ if p .cn != cn {
343+ panic ("p.cn != cn" )
344+ }
345+ return nil
346+ }
347+
348+ func (p * singleConnPool ) Len () int {
349+ return 1
350+ }
351+
352+ func (p * singleConnPool ) FreeLen () int {
353+ return 0
354+ }
355+
356+ func (p * singleConnPool ) Close () error {
357+ return nil
358+ }
359+
360+ //------------------------------------------------------------------------------
361+
362+ type stickyConnPool struct {
317363 pool pool
318364 reusable bool
319365
@@ -322,27 +368,21 @@ type singleConnPool struct {
322368 mx sync.Mutex
323369}
324370
325- func newSingleConnPool (pool pool , reusable bool ) * singleConnPool {
326- return & singleConnPool {
371+ func newStickyConnPool (pool pool , reusable bool ) * stickyConnPool {
372+ return & stickyConnPool {
327373 pool : pool ,
328374 reusable : reusable ,
329375 }
330376}
331377
332- func newSingleConnPoolConn (cn * conn ) * singleConnPool {
333- return & singleConnPool {
334- cn : cn ,
335- }
336- }
337-
338- func (p * singleConnPool ) First () * conn {
378+ func (p * stickyConnPool ) First () * conn {
339379 p .mx .Lock ()
340380 cn := p .cn
341381 p .mx .Unlock ()
342382 return cn
343383}
344384
345- func (p * singleConnPool ) Get () (* conn , error ) {
385+ func (p * stickyConnPool ) Get () (* conn , error ) {
346386 defer p .mx .Unlock ()
347387 p .mx .Lock ()
348388
@@ -362,15 +402,13 @@ func (p *singleConnPool) Get() (*conn, error) {
362402 return p .cn , nil
363403}
364404
365- func (p * singleConnPool ) put () (err error ) {
366- if p .pool != nil {
367- err = p .pool .Put (p .cn )
368- }
405+ func (p * stickyConnPool ) put () (err error ) {
406+ err = p .pool .Put (p .cn )
369407 p .cn = nil
370408 return err
371409}
372410
373- func (p * singleConnPool ) Put (cn * conn ) error {
411+ func (p * stickyConnPool ) Put (cn * conn ) error {
374412 defer p .mx .Unlock ()
375413 p .mx .Lock ()
376414 if p .cn != cn {
@@ -382,30 +420,32 @@ func (p *singleConnPool) Put(cn *conn) error {
382420 return nil
383421}
384422
385- func (p * singleConnPool ) remove () (err error ) {
386- if p .pool != nil {
387- err = p .pool .Remove (p .cn )
388- }
423+ func (p * stickyConnPool ) remove () (err error ) {
424+ err = p .pool .Remove (p .cn )
389425 p .cn = nil
390426 return err
391427}
392428
393- func (p * singleConnPool ) Remove (cn * conn ) error {
429+ func (p * stickyConnPool ) Remove (cn * conn ) error {
394430 defer p .mx .Unlock ()
395431 p .mx .Lock ()
396432 if p .cn == nil {
397433 panic ("p.cn == nil" )
398434 }
399- if cn != nil && cn != p . cn {
400- panic ("cn != p. cn" )
435+ if cn != nil && p . cn != cn {
436+ panic ("p. cn != cn" )
401437 }
402438 if p .closed {
403439 return errClosed
404440 }
405- return p .remove ()
441+ if cn == nil {
442+ return p .remove ()
443+ } else {
444+ return nil
445+ }
406446}
407447
408- func (p * singleConnPool ) Len () int {
448+ func (p * stickyConnPool ) Len () int {
409449 defer p .mx .Unlock ()
410450 p .mx .Lock ()
411451 if p .cn == nil {
@@ -414,7 +454,7 @@ func (p *singleConnPool) Len() int {
414454 return 1
415455}
416456
417- func (p * singleConnPool ) FreeLen () int {
457+ func (p * stickyConnPool ) FreeLen () int {
418458 defer p .mx .Unlock ()
419459 p .mx .Lock ()
420460 if p .cn == nil {
@@ -423,7 +463,7 @@ func (p *singleConnPool) FreeLen() int {
423463 return 0
424464}
425465
426- func (p * singleConnPool ) Close () error {
466+ func (p * stickyConnPool ) Close () error {
427467 defer p .mx .Unlock ()
428468 p .mx .Lock ()
429469 if p .closed {
0 commit comments