Conn Prepared Statements
title: Use Prepared Statements Correctly with Pooling impact: HIGH impactDescription: Avoid prepared statement conflicts in pooled environments tags: prepared-statements, connection-pooling, transaction-mode
Section titled “title: Use Prepared Statements Correctly with Pooling impact: HIGH impactDescription: Avoid prepared statement conflicts in pooled environments tags: prepared-statements, connection-pooling, transaction-mode”Use Prepared Statements Correctly with Pooling
Section titled “Use Prepared Statements Correctly with Pooling”Prepared statements are tied to individual database connections. In transaction-mode pooling, connections are shared, causing conflicts.
Incorrect (named prepared statements with transaction pooling):
-- Named prepared statementprepare get_user as select * from users where id = $1;
-- In transaction mode pooling, next request may get different connectionexecute get_user(123);-- ERROR: prepared statement "get_user" does not existCorrect (use unnamed statements or session mode):
-- Option 1: Use unnamed prepared statements (most ORMs do this automatically)-- The query is prepared and executed in a single protocol message
-- Option 2: Deallocate after use in transaction modeprepare get_user as select * from users where id = $1;execute get_user(123);deallocate get_user;
-- Option 3: Use session mode pooling (port 5432 vs 6543)-- Connection is held for entire session, prepared statements persistCheck your driver settings:
-- Many drivers use prepared statements by default-- Node.js pg: { prepare: false } to disable-- JDBC: prepareThreshold=0 to disableReference: Prepared Statements with Pooling