mirror of https://github.com/jackc/pgx.git
Preallocate poolRow
parent
dc0cf11399
commit
d7fdbf1b49
pool
23
pool/pool.go
23
pool/pool.go
|
@ -28,6 +28,9 @@ type Pool struct {
|
||||||
|
|
||||||
preallocatedConnsMux sync.Mutex
|
preallocatedConnsMux sync.Mutex
|
||||||
preallocatedConns []Conn
|
preallocatedConns []Conn
|
||||||
|
|
||||||
|
preallocatedPoolRowsMux sync.Mutex
|
||||||
|
preallocatedPoolRows []poolRow
|
||||||
}
|
}
|
||||||
|
|
||||||
// Config is the configuration struct for creating a pool. It is highly recommended to modify a Config returned by
|
// Config is the configuration struct for creating a pool. It is highly recommended to modify a Config returned by
|
||||||
|
@ -234,6 +237,24 @@ func (p *Pool) getConn(res *puddle.Resource) *Conn {
|
||||||
return c
|
return c
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (p *Pool) getPoolRow(c *Conn, r pgx.Row) *poolRow {
|
||||||
|
p.preallocatedPoolRowsMux.Lock()
|
||||||
|
|
||||||
|
if len(p.preallocatedPoolRows) == 0 {
|
||||||
|
p.preallocatedPoolRows = make([]poolRow, 128)
|
||||||
|
}
|
||||||
|
|
||||||
|
pr := &p.preallocatedPoolRows[len(p.preallocatedPoolRows)-1]
|
||||||
|
p.preallocatedPoolRows = p.preallocatedPoolRows[0 : len(p.preallocatedPoolRows)-1]
|
||||||
|
|
||||||
|
p.preallocatedPoolRowsMux.Unlock()
|
||||||
|
|
||||||
|
pr.c = c
|
||||||
|
pr.r = r
|
||||||
|
|
||||||
|
return pr
|
||||||
|
}
|
||||||
|
|
||||||
func (p *Pool) Acquire(ctx context.Context) (*Conn, error) {
|
func (p *Pool) Acquire(ctx context.Context) (*Conn, error) {
|
||||||
for {
|
for {
|
||||||
res, err := p.p.Acquire(ctx)
|
res, err := p.p.Acquire(ctx)
|
||||||
|
@ -301,7 +322,7 @@ func (p *Pool) QueryRow(ctx context.Context, sql string, args ...interface{}) pg
|
||||||
}
|
}
|
||||||
|
|
||||||
row := c.QueryRow(ctx, sql, args...)
|
row := c.QueryRow(ctx, sql, args...)
|
||||||
return &poolRow{r: row, c: c}
|
return p.getPoolRow(c, row)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *Pool) SendBatch(ctx context.Context, b *pgx.Batch) pgx.BatchResults {
|
func (p *Pool) SendBatch(ctx context.Context, b *pgx.Batch) pgx.BatchResults {
|
||||||
|
|
Loading…
Reference in New Issue