prepareThreshold参数干什么用的

prepareThreshold参数干什么用的

使用apache sharadingsphere proxy(版本5.5.0)时遇到一个问题,某个业务功能,第一次执行OK,第二次操作就会出现错误,报错信息:

PostgreSQLComDescribeExecutor.java:150 NullException

看到进入到这个类型,我就比较奇怪,怎么不是走prepare那边执行呢?另外,同样的SQL,同样的功能呢,第一次执行OK,可以初步排除掉是业务系统以及SQL语法的问题。

找了相关资料,发现进入DescribeStatement相关的处理过程,说明服务端已经开始进行SQL语句的预编译和复用相关处理了。这个功能,需要JDBC客户端和服务端配合起来才行。

单步跟踪到JDBC的本地执行过程发现,JDBC的URL上配置prepareThreshold参数,可以对此功能进行控制。

#关闭SQL预编译缓存功能
prepareThreshold=0

#默认值,5次执行后,开启缓存功能
prepareThreshold=5

#其他值,超越配置值后,开启缓存功能。
prepareThreshold=XXX

JDBC的URL上配置prepareThreshold=0,重新验证业务功能,发现现象消失。为何第一次可以,第二次不可以呢?

因为这个功能的一次触发,会导致一个SQL被执行3次,则第二次的第二笔,会触发缓存开启。正好遇到proxy的缺陷。

当前我们选择关闭预编译缓存功能,保平安。

另外,这个预编译缓存开关的计数器,是与具体的connection绑定的,也就是说当某个连接存活期间进行连续计数,连接之间的计数没有关系。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注