[ PROMPT_NODE_23512 ]
conn-prepared-statements
[ SKILL_DOCUMENTATION ]
## 在连接池中正确使用预处理语句
预处理语句绑定到单个数据库连接。在事务模式的连接池中,连接是共享的,这会导致冲突。
**错误做法(在事务池中使用命名预处理语句):**
sql
-- 命名预处理语句
prepare get_user as select * from users where id = $1;
-- 在事务模式池中,下一个请求可能会获取不同的连接
execute get_user(123);
-- 错误: 预处理语句 "get_user" 不存在
**正确做法(使用匿名语句或会话模式):**
sql
-- 选项 1: 使用匿名预处理语句(大多数 ORM 自动执行此操作)
-- 查询在单个协议消息中准备并执行
-- 选项 2: 在事务模式下使用后取消分配 (deallocate)
prepare get_user as select * from users where id = $1;
execute get_user(123);
deallocate get_user;
-- 选项 3: 使用会话模式连接池(端口 5432 vs 6543)
-- 连接在整个会话期间保持,预处理语句持久存在
检查驱动程序设置:
sql
-- 许多驱动程序默认使用预处理语句
-- Node.js pg: 设置 { prepare: false } 以禁用
-- JDBC: 设置 prepareThreshold=0 以禁用
参考:[连接池中的预处理语句](https://supabase.com/docs/guides/database/connecting-to-postgres#connection-pool-modes)