diff --git a/go/mysql/conn.go b/go/mysql/conn.go index edb1201afe3..63eb0279349 100644 --- a/go/mysql/conn.go +++ b/go/mysql/conn.go @@ -228,6 +228,8 @@ func newConn(conn net.Conn) *Conn { } } +var readersPool = sync.Pool{New: func() interface{} { return bufio.NewReaderSize(nil, 16*1024) }} + // newServerConn should be used to create server connections. // // It stashes a reference to the listener to be able to determine if @@ -241,11 +243,18 @@ func newServerConn(conn net.Conn, listener *Listener) *Conn { PrepareData: make(map[uint32]*PrepareData), } if listener.connReadBufferSize > 0 { - c.bufferedReader = bufio.NewReaderSize(conn, listener.connReadBufferSize) + buf := readersPool.Get().(*bufio.Reader) + buf.Reset(conn) + c.bufferedReader = buf } return c } +func (c *Conn) returnReader() { + c.bufferedReader.Reset(nil) + readersPool.Put(c.bufferedReader) +} + // startWriterBuffering starts using buffered writes. This should // be terminated by a call to endWriteBuffering. func (c *Conn) startWriterBuffering() { diff --git a/go/mysql/server.go b/go/mysql/server.go index e6de1925974..6dd9b9f6d0d 100644 --- a/go/mysql/server.go +++ b/go/mysql/server.go @@ -306,6 +306,8 @@ func (l *Listener) handle(conn net.Conn, connectionID uint32, acceptTime time.Ti // startWriterBuffering is called c.endWriterBuffering() + c.returnReader() + conn.Close() }()