使用PreparedStatments进行约束排除 - PostgreSQL

时间:2011-10-28 22:47:24

标签: java postgresql jdbc prepared-statement

根据PostgreSQL文档部分:5.9.6. Caveats

  

约束排除仅在查询的WHERE子句包含时才有效   常量。参数化查询将不会被优化,因为   planner无法知道参数值可能选择哪些分区   在运行时。

是否有任何库提供某种PreparedStatement(我的意思是只有SQL注入工具,因为我们无法从PreparedStatement的优化性能中受益)并且还生成一个静态SQL字符串,因此我们可以从中受益来自约束排除功能?

2 个答案:

答案 0 :(得分:1)

您可以将PostgreSQL JDBC驱动程序配置为在一定数量的调用后切换到预准备语句。请参阅Connection to the Database变量prepareThreshold,并按照该部分中的链接进行操作。

在您的情况下,您可以尝试使用值0或非常大的数字。我不确定0是否意味着“立即使用准备好的陈述”或“从不使用准备好的陈述”。大量数据应该可以防止准备好的陈述。

使用此方法,您的Java代码仍然使用PreparedStatement,驱动程序负责正确引用。驱动程序和服务器之间的协议将使用“未准备”的语句。

答案 1 :(得分:1)

Apache commons-lang有一个基本的转义方法... javadoc:

例如,

statement.executeQuery("SELECT * FROM MOVIES WHERE TITLE='" + 
   StringEscapeUtils.escapeSql("McHale's Navy") + 
   "'");

目前,这种方法只能将单引号变为双引号(“麦克海尔海军”=“麦克海尔海军”)。它不处理在LIKE子句中使用的百分比(%)或下划线(_)的情况。

http://commons.apache.org/lang/api-2.4/org/apache/commons/lang/StringEscapeUtils.html#escapeSql(java.lang.String%29

HTH