Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么PostgreSQL JDBC prepared语句阈值默认为5?_Postgresql_Jdbc_Prepared Statement - Fatal编程技术网

为什么PostgreSQL JDBC prepared语句阈值默认为5?

为什么PostgreSQL JDBC prepared语句阈值默认为5?,postgresql,jdbc,prepared-statement,Postgresql,Jdbc,Prepared Statement,默认情况下,参数语句treshold设置为5,而不是1。就是 ((PGStatement) my_statement).getPrepareThreshold() 默认情况下,始终返回5 原因是什么?为什么我不想在执行查询的前4次使用服务器端prepared语句?我无法理解为什么我会将其设置为1以外的另一个值,以及为什么默认情况下不会设置为1 你能解释一下吗?非常感谢。服务器端准备的语句消耗服务器端资源来存储语句的执行计划。阈值提供了一种启发式方法,可以使实际“经常”使用的语句得到准备。“经常

默认情况下,参数语句treshold设置为5,而不是1。就是

((PGStatement) my_statement).getPrepareThreshold()
默认情况下,始终返回5

原因是什么?为什么我不想在执行查询的前4次使用服务器端prepared语句?我无法理解为什么我会将其设置为1以外的另一个值,以及为什么默认情况下不会设置为1


你能解释一下吗?非常感谢。

服务器端准备的语句消耗服务器端资源来存储语句的执行计划。阈值提供了一种启发式方法,可以使实际“经常”使用的语句得到准备。“经常”的定义默认为5

请注意,服务器端prepared语句可能会导致执行计划不佳,因为它们不基于prepare过程中传递的参数。如果传递给预处理语句的参数在特定索引上具有不同的选择性(例如),则预处理语句的一般查询计划可能是次优的。另一个例子是,如果查询的执行远远大于创建解释计划的成本,并且解释计划由于缺少绑定参数而没有正确设置,那么最好不要使用服务器端准备的语句

当驱动程序达到阈值时,它将准备以下语句:

    if (!oneShot)
    {
        // Generate a statement name to use.
        statementName = "S_" + (nextUniqueID++);

        // And prepare the new statement.
        // NB: Must clone the OID array, as it's a direct reference to
        // the SimpleParameterList's internal array that might be modified
        // under us.
        query.setStatementName(statementName);
        query.setStatementTypes((int[])typeOIDs.clone());
    }

语句名作为wire协议的一部分发送,该协议告诉Postgres在服务器端进行准备。

因此,本质上,如果我们使用准备好的语句功能(Connection.prepareStatement(…)函数)进行一次性查询,我们只会从参数绑定的好处中获益,而没有SQL注入风险,等等?这是否意味着JDBC驱动程序将把这个准备好的语句转换成一个常规语句,以“伪造”这个参数绑定前4次?如果是这样的话,这很有道理。它不会伪造装订。。。唯一的区别是在发送到服务器时是否将名称附加到查询(请参见答案中的编辑)。谢谢,我现在就知道了。命名查询将导致在服务器上保存执行计划。由于这是昂贵的,因此默认情况下,只有在查询执行5次后才能执行此操作。