PgBouncer có ba pool mode; transaction mode là mode dùng phổ biến nhất cho ứng dụng web.
session— client giữ một server connection tới khi ngắt kết nối. An toàn nhất, ghép nối kém nhất.transaction— server connection chỉ gán cho client trong một transaction;COMMITxong là trả về pool cho client khác. Nhờ vậy 2000 client ứng dụng có thể chia sẻ 40 kết nối thật.statement— trả về pool sau từng câu lệnh, không cho phép transaction nhiều câu.
Vấn đề với transaction mode: mọi thứ gắn với session chứ không gắn với transaction đều không đáng tin, vì câu lệnh kế tiếp có thể rơi vào server connection khác:
- Prepared statement —
PREPAREnằm trên một backend cụ thể; lầnEXECUTEsau có thể trúng backend khác →prepared statement "S_1" does not exist. Driver Java/Node/Go thường bật prepared statement ngầm. Cách xử lý: tắt ở driver (vdprepareThreshold=0,statement_cache_size=0), hoặc dùngmax_prepared_statementscủa PgBouncer (từ 1.21) để nó tự theo dõi và tạo lại. SETcấp session (SET search_path,SET timezone,SET ROLE) — không còn hiệu lực ở câu lệnh sau. DùngSET LOCALtrong transaction, hoặc đặt ở cấp database/user.- Advisory lock cấp session,
LISTEN/NOTIFY, temp table, cursorWITH HOLD— đều không dùng được; advisory lock phải chuyển sang biến thể_xact.
Hệ quả vận hành cần nhớ: một transaction mở lâu sẽ giữ luôn một server connection, nên transaction dài làm cạn pool nhanh hơn hẳn so với không có pooler.