From bc139fadb5b49cf4159b33c1312cc66ef0582c7e Mon Sep 17 00:00:00 2001 From: Jack Christensen Date: Thu, 18 Apr 2019 22:01:47 -0500 Subject: [PATCH] Reuse one ResultReader per connection --- pgconn.go | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/pgconn.go b/pgconn.go index 82a010b8..4cf4d745 100644 --- a/pgconn.go +++ b/pgconn.go @@ -98,7 +98,9 @@ type PgConn struct { bufferingReceiveMsg pgproto3.BackendMessage bufferingReceiveErr error - wbuf []byte // Reusable write buffer + // Reusable / preallocated resources + wbuf []byte // write buffer + resultReader ResultReader } // Connect establishes a connection to a PostgreSQL server using the environment and connString (in URL or DSN format) @@ -756,11 +758,12 @@ func (pgConn *PgConn) ExecPrepared(ctx context.Context, stmtName string, paramVa } func (pgConn *PgConn) execExtendedPrefix(ctx context.Context, paramValues [][]byte) *ResultReader { - result := &ResultReader{ + pgConn.resultReader = ResultReader{ pgConn: pgConn, ctx: ctx, cleanupContextDeadline: func() {}, } + result := &pgConn.resultReader if err := pgConn.lock(); err != nil { result.concludeCommand("", err) @@ -1035,20 +1038,22 @@ func (mrr *MultiResultReader) NextResult() bool { switch msg := msg.(type) { case *pgproto3.RowDescription: - mrr.rr = &ResultReader{ + mrr.pgConn.resultReader = ResultReader{ pgConn: mrr.pgConn, multiResultReader: mrr, ctx: mrr.ctx, cleanupContextDeadline: func() {}, fieldDescriptions: msg.Fields, } + mrr.rr = &mrr.pgConn.resultReader return true case *pgproto3.CommandComplete: - mrr.rr = &ResultReader{ + mrr.pgConn.resultReader = ResultReader{ commandTag: CommandTag(msg.CommandTag), commandConcluded: true, closed: true, } + mrr.rr = &mrr.pgConn.resultReader return true case *pgproto3.EmptyQueryResponse: return false