我正在编写一个客户端工具,它使用PreparedStatements 查询Postgres 数据库。我遇到了一些问题。该工具必须支持各种 Postgres 设置。其中一些设置在事务池模式下使用 pgBouncer,该模式不支持准备好的语句。在事前确定这一点并不容易,因此这里的解决方法是使用prepareThreshold=0 jdbc 参数集重试。
我试图弄清楚默认设置jdbc参数prepareThreshold = 0的效果。
据我了解设置该参数的效果是:
准备好的语句的客户端优势(分配更少的 Java 对象,防止 SQL 注入)不会受到影响。
PreparedStatement 不再被缓存。仅当您一遍又一遍地进行相同的查询时,才对服务器端有利。我相信默认值是 5(即只有在 5 次重复查询后才能看到性能提升)
我正在使用的工具仅发出几个查询,因此我试图了解添加此 JDBC 参数对我来说是否安全,以及这可能会产生什么影响。
不使用准备好的语句是安全的。唯一的影响可能是性能有所下降,特别是如果您有许多简短的语句,其中规划语句的开销是显着的。
从 PgBouncer 1.21.0 开始,它现在支持名为预准备语句的协议级别,因此您不必再在 JDBC 中禁用预准备语句。您可以通过在 PgBouncer 的配置文件中将
max_prepared_statements
设置为非零值来打开此支持。有关详细信息,请查看文档:https://www.pgbouncer.org/config.html#max_prepared_statements