
рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдЖрд╡реЗрджрди рдХрд╛ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдбреАрдмреАрдП рдФрд░ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рдмреАрдЪ рдпреБрджреНрдз рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ: рдбреАрдмреАрдП рдЪрд┐рд▓реНрд▓рд╛рддрд╛ рд╣реИ: "рдЖрдкрдХрд╛ рдЖрд╡реЗрджрди рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдЧрд┐рд░рд╛ рджреЗрддрд╛ рд╣реИ", рдбреЗрд╡рд▓рдкрд░реНрд╕ - "рд▓реЗрдХрд┐рди рд╕рдм рдХреБрдЫ рдкрд╣рд▓реЗ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ!" рд╕рдмрд╕реЗ рдмреБрд░реА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдбреАрдмреАрдП рдФрд░ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдПрдХ-рджреВрд╕рд░реЗ рдХреА рдорджрдж рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдХреБрдЫ рдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдФрд░ рдбреНрд░рд╛рдЗрд╡рд░ рдХреА рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдкрддрд╛ рд╣реИ, рджреВрд╕рд░реЛрдВ рдХреЛ рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдкрддрд╛ рд╣реИред рдРрд╕реА рд╕реНрдерд┐рддрд┐ рд╕реЗ рдмрдЪрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред
рдЖрдкрдХреЛ рд╕рдордЭрдирд╛ рд╣реЛрдЧрд╛, рдпрд╣ рдЕрдХреНрд╕рд░ go-database-sql.org рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИред рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреЗ рдЕрдиреБрднрд╡ рдХреЗ рд╕рд╛рде рдмрд╛рдВрдЯрдирд╛ рдмреЗрд╣рддрд░ рд╣реИред рдЗрд╕рд╕реЗ рднреА рдмреЗрд╣рддрд░ рдЕрдЧрд░ рдпрд╣ рд░рдХреНрдд рдФрд░ рдЦреЛрдП рд╣реБрдП рдкреИрд╕реЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЕрдиреБрднрд╡ рд╣реИред
рдореЗрд░рд╛ рдирд╛рдо рд░рд╛рдпрдмрд┐рдиреНрдХреЛрд╡ рдЖрд░реНрдЯреЗрдо рд╣реИ рдФрд░ рдпрд╣ рд▓реЗрдЦ рд╕рдВрддрд╛ рд╣рд╛рдИрд▓рд╛рдб 2019 рд╕рдореНрдореЗрд▓рди рд╕реЗ рдореЗрд░реА рд░рд┐рдкреЛрд░реНрдЯ рдХреА рдПрдХ рдореБрдХреНрдд рд╡реНрдпрд╛рдЦреНрдпрд╛ рд╣реИред
рдЙрдкрдХрд░рдг
рдЖрдк рдЧреЛ- database-sql.org рдкрд░ рдХрд┐рд╕реА рднреА SQL рдЬреИрд╕реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдиреНрдпреВрдирддрдо рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдкрдиреЗ рдЗрд╕реЗ рдирд╣реАрдВ рдкрдврд╝рд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдкрдврд╝реЗрдВред
sqlx
рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдЧреЛ рдХреА рд╢рдХреНрддрд┐ рд╕рд░рд▓рддрд╛ рд╣реИред рдФрд░ рдпрд╣ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕рдореЗрдВ рдЧреЛ рдЯреВ рдирдВрдЧреЗ рдПрд╕рдХреНрдпреВрдПрд▓ рдореЗрдВ рдкреНрд░рд╢реНрди рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдерд╛рдЧрдд рд╣реИ (ORM рд╕рдореНрдорд╛рди рдореЗрдВ рдирд╣реАрдВ рд╣реИ)ред рдпрд╣ рдПрдХ рдлрд╛рдпрджрд╛ рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдХрд╛ рд╕реНрд░реЛрдд рд╣реИред
рдЗрд╕рд▓рд┐рдП, рдорд╛рдирдХ database/sql
рднрд╛рд╖рд╛ рдкреИрдХреЗрдЬ рд▓реЗрддреЗ рд╣реБрдП, рдЖрдк рдЗрд╕рдХреЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред рдПрдХ рдмрд╛рд░ рдРрд╕рд╛ рд╣реЛрдиреЗ рдкрд░, github.com/jmoiron/sqlx рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВред рдореИрдВ рдЖрдкрдХреЛ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рд╡рд┐рд╕реНрддрд╛рд░ рдЖрдкрдХреЗ рдЬреАрд╡рди рдХреЛ рдХреИрд╕реЗ рд╕рд░рд▓ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред
рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрд╕рд╕реНрдХреИрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд╕реНрддрдВрднреЛрдВ рд╕реЗ рд╕рдВрд░рдЪрдирд╛ рдЧреБрдгреЛрдВ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддреА рд╣реИред
type Place struct { Country string City sql.NullString TelephoneCode int `db:"telcode"` } var p Place err = rows.StructScan(&p)
NamedQuery рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЖрдк рдХрд┐рд╕реА рдХреНрд╡реЗрд░реА рдореЗрдВ рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрд░рдЪрдирд╛ рдЧреБрдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
p := Place{Country: "South Africa"} sql := `.. WHERE country=:country` rows, err := db.NamedQuery(sql, p)
рдЧреЗрдЯ рдФрд░ рд╕реЗрд▓реЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЖрдк рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рд▓рд╛рдЗрдиреЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЫреЛрд░реЛрдВ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред
var p Place var pp []Place
рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ
database/sql
рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИ, рдФрд░ sqlx
рдЙрдирдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╣реИред рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрди рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд▓рд┐рдП, рдЙрдиреНрд╣реЗрдВ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдбреНрд░рд╛рдЗрд╡рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВред
рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдбреНрд░рд╛рдЗрд╡рд░:
- github.com/lib/pq -
pure Go Postgres driver for database/sql.
рдпрд╣ рдбреНрд░рд╛рдЗрд╡рд░ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдирдХ рдмрдирд╛ рд╣реБрдЖ рд╣реИред рд▓реЗрдХрд┐рди рдЖрдЬ рдпрд╣ рдЕрдкрдиреА рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХрддрд╛ рдЦреЛ рдЪреБрдХрд╛ рд╣реИ рдФрд░ рд▓реЗрдЦрдХ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдХрд╕рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред - github.com/jackc/pgx -
PostgreSQL driver and toolkit for Go.
рдЖрдЬ рдЗрд╕ рдЙрдкрдХрд░рдг рдХреЛ рдЪреБрдирдирд╛ рдмреЗрд╣рддрд░ рд╣реИред
github.com/jackc/pgx - рдпрд╣ рд╡рд╣ рдбреНрд░рд╛рдЗрд╡рд░ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдХреНрдпреЛрдВ?
- рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рд╕рдорд░реНрдерд┐рдд рдФрд░ рд╡рд┐рдХрд╕рд┐рдд ред
- рдпрджрд┐
database/sql
рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдмрд┐рдирд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдпрд╣ рдЕрдзрд┐рдХ рдЙрддреНрдкрд╛рджрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред - 60 рд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЗ PostgreSQL рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛ
SQL
рдорд╛рдирдХ рдХреЗ рдмрд╛рд╣рд░ PostgreSQL
рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред - рдбреНрд░рд╛рдЗрд╡рд░ рдХреЗ рдЕрдВрджрд░ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ред
pgx
рдорд╛рдирд╡-рдкрдардиреАрдп рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реИрдВ , рдЬрдмрдХрд┐ рд╕рд┐рд░реНрдл lib/pq
рдкреИрдирд┐рдХ рдЕрдЯреИрдХ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдПрдХ рдЖрддрдВрдХ рдирд╣реАрдВ рдкрдХрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред ( рдЖрдкрдХреЛ рдЧреЛ рдореЗрдВ рдЖрддрдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╣ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИред )pgx
рд╕рд╛рде, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреНрд░рддреНрдпреЗрдХ рдХрдиреЗрдХреНрд╢рди рдХреЛ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИредPostgreSQL
рддрд╛рд░реНрдХрд┐рдХ рдкреНрд░рддрд┐рдХреГрддрд┐ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рд╣реИ ред
4KB
рдЖрдорддреМрд░ рдкрд░, рд╣рдо рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд▓реВрдк рдХреЛ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
rows, err := s.db.QueryContext(ctx, sql) for rows.Next() { err = rows.Scan(...) }
рдбреНрд░рд╛рдЗрд╡рд░ рдХреЗ рдЕрдВрджрд░, рд╣рдореЗрдВ рдПрдХ 4KB рдмрдлрд░ рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд░рдХреЗ рдбреЗрдЯрд╛ рдорд┐рд▓рддрд╛ рд╣реИред rows.Next()
рдПрдХ рдиреЗрдЯрд╡рд░реНрдХ рдпрд╛рддреНрд░рд╛ рдХреЛ рдЬрдиреНрдо рджреЗрддреА рд╣реИ рдФрд░ рдмрдлрд░ рдХреЛ рднрд░рддреА рд╣реИред рдпрджрд┐ рдмрдлрд░ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ, рддреЛ рд╣рдо рд╢реЗрд╖ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВред рдЕрдзрд┐рдХ рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛ рджреМрд░рд╛ - рдХрдо рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдЧрддрд┐ред рджреВрд╕рд░реА рдУрд░, рдЪреВрдВрдХрд┐ рдмрдлрд░ рд╕реАрдорд╛ 4KB рд╣реИ, рдЪрд▓реЛ рдкреВрд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдореЛрд░реА рдХреЛ рдирд╣реАрдВ рднреВрд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред
рд▓реЗрдХрд┐рди, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдореИрдВ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдФрд░ рд╣рдорд╛рд░реА рд╕реЗрд╡рд╛ рдХреА рд╡рд┐рд▓рдВрдмрддрд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдлрд░ рд╡реЙрд▓реНрдпреВрдо рдХреЛ рдЕрдзрд┐рдХрддрдо рддрдХ рдкрд╣реБрдВрдЪрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рд╣рдо рдЗрд╕ рдЕрд╡рд╕рд░ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рд╕рд┐рдВрдереЗрдЯрд┐рдХ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдкрд░ рдЕрдкреЗрдХреНрд╖рд┐рдд рддреНрд╡рд░рдг рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ:
$ go test -v -run=XXX -bench=. -benchmem goos: linux goarch: amd64 pkg: github.com/furdarius/pgxexperiments/bufsize BenchmarkBufferSize/4KB 5 315763978 ns/op 53112832 B/op 12967 allocs/op BenchmarkBufferSize/8KB 5 300140961 ns/op 53082521 B/op 6479 allocs/op BenchmarkBufferSize/16KB 5 298477972 ns/op 52910489 B/op 3229 allocs/op BenchmarkBufferSize/1MB 5 299602670 ns/op 52848230 B/op 50 allocs/op PASS ok github.com/furdarius/pgxexperiments/bufsize 10.964s
рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреА рдЧрддрд┐ рдореЗрдВ рдХреЛрдИ рдмрдбрд╝рд╛ рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИред рдРрд╕рд╛ рдХреНрдпреЛрдВ?
рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд╣рдо рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рдХреЗ рдЕрдВрджрд░ рдбреЗрдЯрд╛ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдмрдлрд░ рдХреЗ рдЖрдХрд╛рд░ рддрдХ рд╕реАрдорд┐рдд рд╣реИрдВред рдЗрд╕ рдмрдлрд╝рд░ рдХрд╛ рдЖрдХрд╛рд░ 8KB рд╣реИ ред strace
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП strace
рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдУрдПрд╕ рд░реАрдб рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдореЗрдВ 8192
рдмрд╛рдЗрдЯ рджреЗрддрд╛ рд╣реИред рдФрд░ tcpdump
рдкреИрдХреЗрдЯ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде рдЗрд╕рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рддрд╛ рд╣реИред
рдЯреЙрдо рд▓реЗрди ( рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рдХрд░реНрдиреЗрд▓ рдХреЗ рдореБрдЦреНрдп рдбреЗрд╡рд▓рдкрд░реНрд╕ рдореЗрдВ рд╕реЗ рдПрдХ ) рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЯрд┐рдкреНрдкрдгреА рдХрд░рддрд╛ рд╣реИ :
рдкрд░рдВрдкрд░рд╛рдЧрдд рд░реВрдк рд╕реЗ, рдХрдо рд╕реЗ рдХрдо, рдпрд╣ рдпреВрдирд┐рдХреНрд╕ рдорд╢реАрдиреЛрдВ рдореЗрдВ рдкрд╛рдЗрдк рдмрдлрд╝рд░реНрд╕ рдХреЗ рдЖрдХрд╛рд░ рдХрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рдпрд╣ рдпреВрдирд┐рдХреНрд╕ рд╕реЙрдХреЗрдЯ рдореЗрдВ рдбреЗрдЯрд╛ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЗрд╖реНрдЯрддрдо рдЪрдВрдХ рдЖрдХрд╛рд░ рд╣реИред
рдПрдВрдбреНрд░реЗрд╕ рдлреНрд░реБрдВрдб ( рдПрдВрдЯрд░рдкреНрд░рд╛рдЗрдЬрдбреАрдмреА рд╕реЗ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬреБрдПрдЯ рдбреЗрд╡рд▓рдкрд░ ) рдХрд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ 8KB рдмрдлрд░ рдЖрдЬ рддрдХ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЖрдкрдХреЛ рд╡рд┐рднрд┐рдиреНрди рдЖрдХрд╛рд░реЛрдВ рдкрд░ рдФрд░ рдПрдХ рдЕрд▓рдЧ рд╕реЙрдХреЗрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рд╣рдореЗрдВ рдпрд╣ рднреА рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ PgBouncer рдореЗрдВ рдПрдХ рдмрдлрд░ рднреА рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдЖрдХрд╛рд░ pkt_buf
рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
OIDs
Pgx ( v3 ) рдбреНрд░рд╛рдЗрд╡рд░ рдХреА рдПрдХ рдФрд░ рд╡рд┐рд╢реЗрд╖рддрд╛: рдкреНрд░рддреНрдпреЗрдХ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП, рдпрд╣ рдСрдмреНрдЬреЗрдХреНрдЯ рдЖрдИрдбреА ( OID ) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИред
рдЗрди рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЖрдВрддрд░рд┐рдХ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд╣рдЪрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛: рдкрдВрдХреНрддрд┐рдпрд╛рдБ, рдЯреЗрдмрд▓, рдлрд╝рдВрдХреНрд╢рдВрд╕ рдЗрддреНрдпрд╛рджрд┐ред
рдбреНрд░рд╛рдЗрд╡рд░ рдбреЗрдЯрд╛ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЙрд▓рдо рдореЗрдВ рднрд╛рд╖рд╛ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП OIDs
рдЬреНрдЮрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП, pgx
рдРрд╕реА рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ ( рдХреБрдВрдЬреА рдкреНрд░рдХрд╛рд░ рдирд╛рдо рд╣реИ, рдорд╛рди рдСрдмреНрдЬреЗрдХреНрдЯ рдЖрдИрдбреА рд╣реИ )
map[string]Value{ "_aclitem": 2, "_bool": 3, "_int4": 4, "_int8": 55, ... }
рдпрд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЗрд╕ рддрдереНрдп рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдерд╛рдкрд┐рдд рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдбреНрд░рд╛рдЗрд╡рд░ Object ID
рд╕рд╛рде рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдЧрднрдЧ рддреАрди рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИред рдбреЗрдЯрд╛рдмреЗрд╕ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдореЛрдб рдореЗрдВ, рдЧреЛ рдореЗрдВ рдХрдиреЗрдХреНрд╢рди рдкреВрд▓ рдЖрдкрдХреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдирдП рдХрдиреЗрдХреНрд╢рди рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рдХрд░рдиреЗ рджреЗрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдбреЗрдЯрд╛рдмреЗрд╕ рдХреА рдереЛрдбрд╝реА рдЧрд┐рд░рд╛рд╡рдЯ рдкрд░, рдЖрд╡реЗрджрди рдкрдХреНрд╖ рдкрд░ рдХрдиреЗрдХреНрд╢рди рдХрд╛ рдкреВрд▓ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рддрд┐ рдпреВрдирд┐рдЯ рд╕рдордп рдкрд░ рдЙрддреНрдкрдиреНрди рдХрдиреЗрдХреНрд╢рди рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХрд╛рдлреА рд╡реГрджреНрдзрд┐ рд╣реЛрддреА рд╣реИред OIDs
рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХрд╛рдлреА рднрд╛рд░реА рд╣реИрдВ, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЪрд╛рд▓рдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд▓рд╛ рд╕рдХрддрд╛ рд╣реИред
рдпрд╣рд╛рдВ рд╡рд╣ рдХреНрд╖рдг рд╣реИ рдЬрдм рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрдиреБрд░реЛрдз рд╣рдорд╛рд░реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕реЗ рдПрдХ рдкрд░ рдбрд╛рд▓реЗ рдЧрдП рдереЗ:

рд╕рд╛рдорд╛рдиреНрдп рдореЛрдб рдореЗрдВ рдкреНрд░рддрд┐ рдорд┐рдирдЯ 15 рд▓реЗрдирджреЗрди , рдЧрд┐рд░рд╛рд╡рдЯ рдХреЗ рджреМрд░рд╛рди 6500 рддрдХ рдХрд╛ рд▓реЗрдирджреЗрди ред
рдХреНрдпрд╛ рдХрд░реЗрдВ?
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдФрд░ рд╕рдмрд╕реЗ рдКрдкрд░, рдЕрдкрдиреЗ рдкреВрд▓ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдКрдкрд░ рд╕реЗ рд╕реАрдорд┐рдд рдХрд░реЗрдВред
database/sql
рдпрд╣ DB.SetMaxOpenConns рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк database/sql
рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ рдФрд░ pgx.ConnPool
( рдбреНрд░рд╛рдЗрд╡рд░ рджреНрд╡рд╛рд░рд╛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдХрдиреЗрдХреНрд╢рди рдкреВрд▓ ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк MaxConnections
рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ( рдбрд┐рдлрд╝реЙрд▓реНрдЯ 5 рд╣реИ )ред
рд╡реИрд╕реЗ, pgx.ConnPool
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ pgx.ConnPool
рдЪрд╛рд▓рдХ рдкреНрд░рд╛рдкреНрдд pgx.ConnPool
рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ рдФрд░ рд╣рд░ рдирдП рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдкреНрд░рд╢реНрди рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред
рдпрджрд┐ рдЖрдк database/sql
рдХреЛ рдордирд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╕реНрд╡рдпрдВ OIDs
рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреИрд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
github.com/jackc/pgx/stdlib.OpenDB(pgx.ConnConfig{ CustomConnInfo: func(c *pgx.Conn) (*pgtype.ConnInfo, error) { cachedOids =
рдпрд╣ рдПрдХ рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдирд╛ рджреЛ рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдЦрддрд░рдирд╛рдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:
- рдЖрдк Postgres рдореЗрдВ Enum рдпрд╛ рдбреЛрдореЗрди рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ;
- рдпрджрд┐ рд╡рд┐рдЬрд╝рд╛рд░реНрдб рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЖрдк рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдкреНрд░рддрд┐рдХреГрддрд┐ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рддрд╛рд░реНрдХрд┐рдХ рдкреНрд░рддрд┐рдХреГрддрд┐ рджреНрд╡рд╛рд░рд╛ рдбрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЗрди рд╢рд░реНрддреЛрдВ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рд╕реЗ рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдХреИрд╢реНрдб OIDs
рдЕрдорд╛рдиреНрдп рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╣рдо рдЙрдиреНрд╣реЗрдВ рд╕рд╛рдл рдирд╣реАрдВ рдХрд░ рдкрд╛рдПрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдирдП рдЖрдзрд╛рд░ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рдХреНрд╖рдг рдХреЛ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВред
Postgres
рджреБрдирд┐рдпрд╛ рдореЗрдВ, рднреМрддрд┐рдХ рдкреНрд░рддрд┐рдХреГрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдорддреМрд░ рдкрд░ рдЙрдЪреНрдЪ рдЙрдкрд▓рдмреНрдзрддрд╛ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдереЛрдбрд╝рд╛-рдереЛрдбрд╝рд╛ рдХрд░рдХреЗ рдХреЙрдкреА рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП OIDs
рдХреИрд╢рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдПрдВ рд╢рд╛рдпрдж рд╣реА рдХрднреА рдЬрдВрдЧрд▓реА рдореЗрдВ рджреЗрдЦреА рдЬрд╛рддреА рд╣реИрдВред ( рд▓реЗрдХрд┐рди рдЖрдкрдХреЗ DBA рдХреЗ рд╕рд╛рде рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рдмреЗрд╣рддрд░ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рд▓рд┐рдП рдХрд┐рддрдирд╛ рд╕реНрдЯреИрдВрдбрдмрд╛рдп рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ )ред
pgx
рдбреНрд░рд╛рдЗрд╡рд░ рдХреЗ рдЕрдЧрд▓реЗ рдкреНрд░рдореБрдЦ рд╕рдВрд╕реНрдХрд░рдг - v4
, pgx
рд▓рд┐рдП рдХреЛрдИ рдЕрднрд┐рдпрд╛рди рдирд╣реАрдВ рд╣реЛрдЧрд╛ ред рдЕрдм рдбреНрд░рд╛рдЗрд╡рд░ рдХреЗрд╡рд▓ OIDs
рдХреА рд╕реВрдЪреА рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░реЗрдЧрд╛ рдЬреЛ рдХреЛрдб рдореЗрдВ OIDs
рд╣реИрдВред рдХрд╕реНрдЯрдо рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрдХреНрд╖ рдкрд░ рдбреАрд╕реЗрд░рд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА: рдбреНрд░рд╛рдЗрд╡рд░ рдмрд╕ рдмрд╛рдЗрдЯреНрд╕ рдХреА рдПрдХ рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдореГрддрд┐ рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рдЫреЛрдбрд╝ рджреЗрдЧрд╛ред
рд▓реЙрдЧрд┐рдВрдЧ рдФрд░ рдореЙрдирд┐рдЯрд░рд┐рдВрдЧ
рдЖрдзрд╛рд░ рдХреНрд░реИрд╢ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдирд┐рдЧрд░рд╛рдиреА рдФрд░ рд▓реЙрдЧрд┐рдВрдЧ рд╕реЗ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдиреЛрдЯрд┐рд╕ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓реЗрдЧреАред
database/sql
DB.Stats () рд╡рд┐рдзрд┐ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд▓реМрдЯрд╛ рд╣реБрдЖ рд╕реНрдЯреЗрдЯрд╕ рд╕реНрдиреИрдкрд╢реЙрдЯ рдЖрдкрдХреЛ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЗ рдЕрдВрджрд░ рдХреНрдпрд╛ рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рдХрд╛ рдЕрдВрджрд╛рдЬрд╛ рд▓рдЧрд╛рдПрдЧрд╛ред
type DBStats struct { MaxOpenConnections int
рдпрджрд┐ рдЖрдк рд╕реАрдзреЗ pgx
рдореЗрдВ рдкреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ ConnPool.Stat () рд╡рд┐рдзрд┐ рдЖрдкрдХреЛ рдЗрд╕реА рддрд░рд╣ рдХреА рдЬрд╛рдирдХрд╛рд░реА рджреЗрдЧреА:
type ConnPoolStat struct { MaxConnections int CurrentConnections int AvailableConnections int }
рд▓реЙрдЧрд┐рдВрдЧ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдФрд░ pgx
рдЖрдкрдХреЛ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдбреНрд░рд╛рдЗрд╡рд░ Logger
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ, рдЖрдкрдХреЛ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЗ рдЕрдВрджрд░ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╕рднреА рдШрдЯрдирд╛рдПрдВ рдорд┐рд▓рддреА рд╣реИрдВред
type Logger interface {
рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдЖрдкрдХреЛ рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд╕реНрд╡рдпрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдмреЙрдХреНрд╕ рдХреЗ рдмрд╛рд╣рд░ pgx
рдореЗрдВ рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рд▓реЙрдЧрд░ рдХреЗ рд▓рд┐рдП рдПрдбреЗрдкреНрдЯрд░ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИ , рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, uber-go / zap , sirupsen / logrus , rs / zerolog ред
рдЖрдзрд╛рд░рднреВрдд рд╕рдВрд░рдЪрдирд╛
рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ Postgres
рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдЖрдк рдХрдиреЗрдХреНрд╢рди рдкреВрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдпрд╣ PgBouncer ( рдпрд╛ рдУрдбрд┐рд╕реА - рдпрджрд┐ рдЖрдк рдпрд╛рдВрдбреЗрдХреНрд╕ рд╣реИрдВ )ред
рдРрд╕рд╛ рдХреНрдпреЛрдВ, рдЖрдк рдЙрддреНрдХреГрд╖реНрдЯ рд▓реЗрдЦ brandur.org/postgres-connections рдореЗрдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдЬрдм рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ 100 рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛ рдЬрд╛рддреА рд╣реИ, рддреЛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рдЧрддрд┐ рдХрдо рд╣реЛрдиреЗ рд▓рдЧрддреА рд╣реИред рдпрд╣ рд╕реНрд╡рдпрдВ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рдХрд╛рд░рдг рд╣реЛрддрд╛ рд╣реИ: рдкреНрд░рддреНрдпреЗрдХ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╢реБрднрд╛рд░рдВрдн, рд╕реНрдиреИрдкрд╢реЙрдЯ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддрдВрддреНрд░ рдФрд░ рдмрд╛рддрдЪреАрдд рдХреЗ рд▓рд┐рдП рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ - рдпрд╣ рд╕рдм рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред
рдпрд╣рд╛рдБ рд╡рд┐рднрд┐рдиреНрди рдХрдиреЗрдХреНрд╢рди рдкреВрд▓рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рд╣реИ :

рдФрд░ PgBouncer рдХреЗ рд╕рд╛рде рдФрд░ рдмрд┐рдирд╛ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдмреИрдВрдбрд╡рд┐рдбреНрдеред

рдирддреАрдЬрддрди, рдЖрдкрдХрд╛ рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪрд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:

рдЬрд╣рд╛рдВ Server
рд╡рд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ 3 рдкреНрд░рддрд┐рдпреЛрдВ ( рдХрдо рд╕реЗ рдХрдо ) рдореЗрдВ kubernetes
рдореЗрдВ рдШреВрдорддреА рд╣реИред рдЕрд▓рдЧ рд╕реЗ, рдПрдХ рд▓реЛрд╣реЗ рдХреЗ рд╕рд░реНрд╡рд░ рдкрд░, Postgres
, рдЬрд┐рд╕реЗ PgBouncer'
рджреНрд╡рд╛рд░рд╛ рдХрд╡рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред PgBouncer
рд╕реНрд╡рдпрдВ рд╕рд┐рдВрдЧрд▓-рдереНрд░реЗрдбреЗрдб рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдХрдИ рдмрд╛рдЙрдВрд╕рд░ рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╣рдо HAProxy
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯреНрд░реИрдлрд╝рд┐рдХ рдХреЛ рд╕рдВрддреБрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдХреНрд╡реЗрд░реА рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдРрд╕реА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдорд┐рд▓рддреА рд╣реИ: тЖТ HAProxy тЖТ PgBouncer тЖТ Postgres
ред
PgBouncer
рддреАрди рдореЛрдб рдореЗрдВ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ:
- рд╕рддреНрд░ рдкреВрд▓рд┐рдВрдЧ - рдкреНрд░рддреНрдпреЗрдХ рд╕рддреНрд░ рдХреЗ рд▓рд┐рдП, рдПрдХ рдХрдиреЗрдХреНрд╢рди рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдкреВрд░реЗ рдЬреАрд╡рди рд╕рдордп рдХреЗ рд▓рд┐рдП рд╕реМрдВрдкрд╛ рдЬрд╛рддрд╛ рд╣реИред
- рд▓реЗрди- рджреЗрди рдЪрд▓ рд░рд╣рд╛ рд╣реИ - рд▓реЗрди-рджреЗрди рдкреВрд▓рд┐рдВрдЧ - рдХрдиреЗрдХреНрд╢рди рд░рд╣рддрд╛ рд╣реИред рдЬреИрд╕реЗ рд╣реА рд▓реЗрди-рджреЗрди рдкреВрд░рд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ,
PgBouncer
рдЗрд╕ рдХрдиреЗрдХреНрд╢рди рдХреЛ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рджреВрд╕рд░реЗ рд▓реЗрдирджреЗрди рдХреЛ рд╡рд╛рдкрд╕ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдореЛрдб рдпреМрдЧрд┐рдХреЛрдВ рдХреЗ рдмрд╣реБрдд рдЕрдЪреНрдЫреЗ рдирд┐рдкрдЯрд╛рди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред - рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдкреВрд▓рд┐рдВрдЧ - рдкрджрд╛рд╡рдирдд рдореЛрдбред рдпрд╣ рдХреЗрд╡рд▓ рдкреАрдПрд▓ / рдкреНрд░реЙрдХреНрд╕реА рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдореЛрдб рдореЗрдВ рдХреНрдпрд╛ рдЧреБрдг рдЙрдкрд▓рдмреНрдз рд╣реИрдВред рд╣рдо Transaction Pooling рдЪреБрдирддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ Prepared Statements
рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рд╕реАрдорд╛рдПрдБ рд╣реИрдВред
рд▓реЗрди-рджреЗрди рдкреВрд▓рд┐рдВрдЧ + рддреИрдпрд╛рд░ рдХрдерди
рдЖрдЗрдП рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рд╣рдо рдПрдХ рдЕрдиреБрд░реЛрдз рддреИрдпрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдЙрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдХреБрдЫ рдмрд┐рдВрджреБ рдкрд░, рд╣рдо рдПрдХ рд▓реЗрдирджреЗрди рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдПрдХ рддреИрдпрд╛рд░ рдЕрдиреБрд░реЛрдз рднреЗрдЬрддреЗ рд╣реИрдВ, рдФрд░ рд╣рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рддреИрдпрд╛рд░ рдЕрдиреБрд░реЛрдз рдХреА рдЖрдИрдбреА рдорд┐рд▓рддреА рд╣реИред

рдмрд╛рдж рдореЗрдВ, рдХрд┐рд╕реА рдЕрдиреНрдп рд╕рдордп рдореЗрдВ, рд╣рдо рдПрдХ рдФрд░ рд▓реЗрдирджреЗрди рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдореЗрдВ, рд╣рдо рдбреЗрдЯрд╛рдмреЗрд╕ рдХреА рдУрд░ рдореБрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЛ рдкреВрд░рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рд▓реЗрди-рджреЗрди рдкреВрд▓рд┐рдВрдЧ рдореЛрдб рдореЗрдВ, рджреЛ рд▓реЗрди-рджреЗрди рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрдиреЗрдХреНрд╢рдиреЛрдВ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдЖрдИрдбреА рдХреЗрд╡рд▓ рдПрдХ рдХрдиреЗрдХреНрд╢рди рдХреЗ рднреАрддрд░ рдорд╛рдиреНрдп рд╣реИред рдХрд┐рд╕реА рдЕрдиреБрд░реЛрдз рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╕рдордп рд╣рдореЗрдВ рдПрдХ prepared statement does not exist
ред
рд╕рдмрд╕реЗ рдЕрдкреНрд░рд┐рдп: рдЪреВрдВрдХрд┐ рд╡рд┐рдХрд╛рд╕ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рд▓реЛрдб рдЫреЛрдЯрд╛ рд╣реИ, PgBouncer
рдЕрдХреНрд╕рд░ рдПрдХ рд╣реА рдХрдиреЗрдХреНрд╢рди рдЬрд╛рд░реА рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рдм рдХреБрдЫ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЬреИрд╕реЗ рд╣реА рд╣рдо рдареЗрд╕ рдкрд╣реБрдВрдЪрддреЗ рд╣реИрдВ, рдЕрдиреБрд░реЛрдз рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддреЗ рд╣реИрдВред
рдЕрдм рдЗрд╕ рдХреЛрдб рдореЗрдВ Prepared Statements
рдЦреЛрдЬреЗрдВ:
sql := `select * from places where city = ?` rows, err := s.db.Query(sql, city)
рдЖрдк рдЙрд╕реЗ рдирд╣реАрдВ рджреЗрдЦреЗрдВрдЧреЗ! рдХреНрд╡реЗрд░реА рддреИрдпрд╛рд░реА рдЕрд╡реНрдпрд╡рд╕реНрдерд┐рдд рд░реВрдк рд╕реЗ Query()
рдЕрдВрджрд░ рд╣реЛрдЧреАред рдЙрд╕реА рд╕рдордп, рдЕрдиреБрд░реЛрдз рдХреА рддреИрдпрд╛рд░реА рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рд╡рд┐рднрд┐рдиреНрди рд▓реЗрдирджреЗрди рдореЗрдВ рд╣реЛрдЧрд╛ рдФрд░ рд╣рдо рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЙрди рд╕рднреА рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдореИрдВрдиреЗ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдерд╛ред
рдХреНрдпрд╛ рдХрд░реЗрдВ?
рдкрд╣рд▓рд╛, рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд╡рд┐рдХрд▓реНрдк Session pooling
рд▓рд┐рдП PgBouncer
рд╕реНрд╡рд┐рдЪ PgBouncer
рд╣реИ ред рдПрдХ рдХрдиреЗрдХреНрд╢рди рд╕рддреНрд░ рдХреЗ рд▓рд┐рдП рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рднреА рд▓реЗрдирджреЗрди рдЗрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ рдЬрд╛рдиреЗ рд▓рдЧрддреЗ рд╣реИрдВ рдФрд░ рддреИрдпрд╛рд░ рдЕрдиреБрд░реЛрдз рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЗрд╕ рдореЛрдб рдореЗрдВ, рдпреМрдЧрд┐рдХреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рджрдХреНрд╖рддрд╛ рд╡рд╛рдВрдЫрд┐рдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХреБрдЫ рдЫреЛрдбрд╝ рджреЗрддреА рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рджреВрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк рдХреНрд▓рд╛рдЗрдВрдЯ рдкрдХреНрд╖ рдкрд░ рдПрдХ рдЕрдиреБрд░реЛрдз рддреИрдпрд╛рд░ рдХрд░рдирд╛ рд╣реИ ред рдореИрдВ рджреЛ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛:
- рд╕рдВрднрд╛рд╡рд┐рдд SQL рдХрдордЬреЛрд░рд┐рдпрд╛рдБред рдбреЗрд╡рд▓рдкрд░ рднреВрд▓ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдмрдЪ рд╕рдХрддрд╛ рд╣реИред
- рд╣рд░ рдмрд╛рд░ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд╡реЗрд░реА рдорд╛рдкрджрдВрдбреЛрдВ рд╕реЗ рдмрдЪрдирд╛ рд╣реЛрдЧрд╛ред
рдПрдХ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рд▓реЗрди-рджреЗрди рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд▓рдкреЗрдЯрдирд╛ рд╣реИ ред рдЖрдЦрд┐рд░рдХрд╛рд░, рдЬрдм рддрдХ рд▓реЗрди-рджреЗрди рд░рд╣рддрд╛ рд╣реИ, PgBouncer
рдХрдиреЗрдХреНрд╢рди рдирд╣реАрдВ PgBouncer
рд╣реИред рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди, рд╣рдорд╛рд░реЗ рдХреЛрдб рдореЗрдВ рд╡рд░реНрдмреЛрд╕рд┐рдЯреА рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдореЗрдВ рдЕрдзрд┐рдХ рдиреЗрдЯрд╡рд░реНрдХ рдХреЙрд▓ рднреА рдорд┐рд▓рддреЗ рд╣реИрдВ: рдЖрд░рдВрдн, рддреИрдпрд╛рд░, рдирд┐рд╖реНрдкрд╛рджрд┐рдд, рдкреНрд░рддрд┐рдмрджреНрдзред рдкреНрд░рддрд┐ рдЕрдиреБрд░реЛрдз рдХреБрд▓ 4 рдиреЗрдЯрд╡рд░реНрдХ рдХреЙрд▓ред рд╡рд┐рд▓рдВрдмрддрд╛ рдмрдврд╝ рд░рд╣реА рд╣реИред
рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рдХреБрд╢рд▓рддрд╛ рд╕реЗ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдФрд░ рдРрд╕рд╛ рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реИ! рдЖрдк рдбреНрд░рд╛рдЗрд╡рд░ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рд╕рд░рд▓ рдХреНрд╡реЗрд░реА рдореЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЗрд╕ рдореЛрдб рдореЗрдВ, рдХреЛрдИ рддреИрдпрд╛рд░реА рдирд╣реАрдВ рд╣реЛрдЧреА рдФрд░ рдкреВрд░рд╛ рдЕрдиреБрд░реЛрдз рдПрдХ рдиреЗрдЯрд╡рд░реНрдХ рдХреЙрд▓ рдореЗрдВ рдкрд╛рд╕ рд╣реЛрдЧрд╛ред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЪрд╛рд▓рдХ рдкреНрд░рддреНрдпреЗрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд╕реНрд╡рдпрдВ рдмрдирд╛ рджреЗрдЧрд╛ ( standard_conforming_strings
рдХреЛ рдмреЗрд╕ рд╕реНрддрд░ рдкрд░ рдпрд╛ рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╕рдордп рд╕рдХреНрд░рд┐рдп рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП )ред
cfg := pgx.ConnConfig{ ... RuntimeParams: map[string]string{ "standard_conforming_strings": "on", }, PreferSimpleProtocol: true, }
рдЕрдиреБрд░реЛрдз рд░рджреНрдж рдХрд░реЗрдВ
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореБрджреНрджреЗ рдЖрд╡реЗрджрди рдкрдХреНрд╖ рдореЗрдВ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд░рджреНрдж рдХрд░рдиреЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВред
рдЗрд╕ рдХреЛрдб рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВред рдиреБрдХрд╕рд╛рди рдХрд╣рд╛рдБ рд╣реИрдВ?
rows, err := s.db.QueryContext(ctx, ...)
рдЬрд╛рдУ рдХрд╛рд░реНрдпрдХреНрд░рдо рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рд╣реИ - рд╕рдВрджрд░реНрдн ред рд╕рдВрджрд░реНрдн ред рдЗрд╕ рдХреЛрдб рдореЗрдВ, рд╣рдо рдбреНрд░рд╛рдЗрд╡рд░ ctx
рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЬрдм рд╕рдВрджрд░реНрдн рдмрдВрдж рд╣реЛ рдЬрд╛рдП, рддреЛ рдбреНрд░рд╛рдЗрд╡рд░ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реНрддрд░ рдкрд░ рдЕрдиреБрд░реЛрдз рдХреЛ рд░рджреНрдж рдХрд░ рджреЗред
рдЗрд╕реА рд╕рдордп, рдпрд╣ рдЙрдореНрдореАрдж рдХреА рдЬрд╛рддреА рд╣реИ рдХрд┐ рд╣рдо рдЙрди рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд░рджреНрдж рдХрд░рдХреЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдмрдЪрд╛рдПрдВрдЧреЗ рдЬрд┐рдирдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЗрдВрддрдЬрд╛рд░ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред рд▓реЗрдХрд┐рди рдПрдХ рдЕрдиреБрд░реЛрдз рдХреЛ рд░рджреНрдж рдХрд░рддреЗ рд╕рдордп, PgBouncer
рд╕рдВрд╕реНрдХрд░рдг 1.7 рдХрдиреЗрдХреНрд╢рди рдХреЛ рд╕реВрдЪрдирд╛ рднреЗрдЬрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрдиреЗрдХреНрд╢рди рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИ, рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рдЗрд╕реЗ рдкреВрд▓ рдореЗрдВ рд▓реМрдЯрд╛рддрд╛ рд╣реИред PgBouncer'
рдХрд╛ рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЛ рдЧреБрдорд░рд╛рд╣ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЬреЛ рдЕрдЧрд▓рд╛ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдкрд░ рддреБрд░рдВрдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ ReadyForQuery
рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рдЕрдВрдд рдореЗрдВ, рд╣рдо рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд ReadyForQuery рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкрдХрдбрд╝рддреЗ рд╣реИрдВ ред
PgBouncer
рд╕рдВрд╕реНрдХрд░рдг 1.8 рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ PgBouncer
, рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рддрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред PgBouncer
рдХреЗ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
рдФрд░, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рдПрдВрдЧреА - рджрд┐рд▓рдЪрд╕реНрдк рд╡реНрдпрд╡рд╣рд╛рд░ рдмрдирд╛ рд░рд╣реЗрдЧрд╛ред рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреЛ рдЗрд╕рдХреЗ рдЕрдиреБрд░реЛрдз рдХрд╛ рдЬрд╡рд╛рдм рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкрдбрд╝реЛрд╕реА рдХреЛ (рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЕрдиреБрд░реЛрдз рдЕрдиреБрд░реЛрдз рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдХреЗ рдкреНрд░рдХрд╛рд░ рдФрд░ рдЖрджреЗрд╢ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВ)ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрд╕ рдХреНрд╡реЗрд░реА рдХреЗ рд▓рд┐рдП where user_id = 2
, рдЙрд╕ рдХреНрд╡реЗрд░реА рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ where user_id = 42
рд╡рд╛рдкрд╕ рдЖрдПрдЧреАред рдпрд╣ рд╡рд┐рднрд┐рдиреНрди рд╕реНрддрд░реЛрдВ рдкрд░ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд░рджреНрдж рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдХрд╛рд░рдг рд╣реИ: рдбреНрд░рд╛рдЗрд╡рд░ рдкреВрд▓ рдФрд░ рдмрд╛рдЙрдВрд╕рд░ рдкреВрд▓ рдХреЗ рд╕реНрддрд░ рдкрд░ред
рд╡рд┐рд▓рдВрдмрд┐рдд рд░рджреНрджреАрдХрд░рдг
рдЕрдиреБрд░реЛрдз рдХреЛ рд░рджреНрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдХрдиреЗрдХреНрд╢рди рдмрдирд╛рдиреЗ рдФрд░ рд░рджреНрдж рдХрд░рдиреЗ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред Postgres
рдкреНрд░рддреНрдпреЗрдХ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдмрдирд╛рддрд╛ рд╣реИред рд╣рдо рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдЕрдиреБрд░реЛрдз рдХреЛ рд░рджреНрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрджреЗрд╢ рднреЗрдЬрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдирдпрд╛ рдХрдиреЗрдХреНрд╢рди рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕рдореЗрдВ рдмреНрдпрд╛рдЬ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЖрдИрдбреА (рдкреАрдЖрдИрдбреА) рд╣рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВред рд▓реЗрдХрд┐рди рдЬрдм рд░рджреНрдж рдЖрджреЗрд╢ рдЖрдзрд╛рд░ рдХреЗ рд▓рд┐рдП рдЙрдбрд╝рд╛рди рднрд░рддрд╛ рд╣реИ, рддреЛ рд░рджреНрдж рдЕрдиреБрд░реЛрдз рдЕрдкрдиреЗ рдЖрдк рд╕рдорд╛рдкреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

Postgres
рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВрдЧреЗ рдФрд░ рджреА рдЧрдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдЕрдиреБрд░реЛрдз рдХреЛ рд░рджреНрдж рдХрд░ рджреЗрдВрдЧреЗред рд▓реЗрдХрд┐рди рд╡рд░реНрддрдорд╛рди рдЕрдиреБрд░реЛрдз рд╡рд╣ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдЬрд┐рд╕реЗ рд╣рдо рд╢реБрд░реВ рдореЗрдВ рд░рджреНрдж рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗред рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдХрд╛рд░рдг рдЬрдм Postgres
рд╕рд╛рде PgBouncer
рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ PgBouncer
рдбреНрд░рд╛рдЗрд╡рд░ рд╕реНрддрд░ рдкрд░ рдЕрдиреБрд░реЛрдз рдХреЛ рд░рджреНрдж рдирд╣реАрдВ рдХрд░рдирд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк CustomCancel
рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ context.Context
рд░рджреНрдж рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рднрд▓реЗ рд╣реА context.Context
ред
cfg := pgx.ConnConfig{ ... CustomCancel: func(_ *pgx.Conn) error { return nil }, }
рдЪреЗрдХрд▓рд┐рд╕реНрдЯ рдкреЛрд╕реНрдЯ рдХрд░рддрд╛ рд╣реИ
рдирд┐рд╖реНрдХрд░реНрд╖ рдХреЗ рдмрдЬрд╛рдп, рдореИрдВрдиреЗ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЪреЗрдХрд▓рд┐рд╕реНрдЯ рдмрдирд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдЗрд╕рд╕реЗ рд▓реЗрдЦ рдХреЛ рдореЗрд░реЗ рд╕рд┐рд░ рдореЗрдВ рдлрд┐рдЯ рд╣реЛрдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓реЗрдЧреАред
- Postgres рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреНрд░рд╛рдЗрд╡рд░ рдХреЗ рд░реВрдк рдореЗрдВ github.com/jackc/pgx рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
- рдКрдкрд░ рд╕реЗ рдХрдиреЗрдХреНрд╢рди рдкреВрд▓ рдХрд╛ рдЖрдХрд╛рд░ рд╕реАрдорд┐рдд рдХрд░реЗрдВред
- рдпрджрд┐ рдЖрдк
pgx
рд╕рдВрд╕реНрдХрд░рдг 3 рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ рддреЛ CID OIDs рдпрд╛ pgx.ConnPool рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред - DB.Stats () рдпрд╛ ConnPool.Stat () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдиреЗрдХреНрд╢рди рдкреВрд▓ рд╕реЗ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдПрдХрддреНрд░ рдХрд░реЗрдВред
- рд▓реЙрдЧ рдЗрди рдХрд░реЗрдВ рдХрд┐ рдбреНрд░рд╛рдЗрд╡рд░ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИред
PgBouncer
рд▓реЗрди-рджреЗрди рдореЛрдб рдореЗрдВ рдХреНрд╡реЗрд░реА рддреИрдпрд╛рд░реА рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рдХреНрд╡реЗрд░реА рдореЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВредPgBouncer
рдХреЛ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВред- рдЖрд╡реЗрджрди рд╕реЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд░рджреНрдж рдХрд░рдиреЗ рд╕реЗ рд╕рд╛рд╡рдзрд╛рди рд░рд╣реЗрдВред