Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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
Java Spring引导JdbcTemplate-禁用语句缓存?_Java_Spring_Postgresql_Spring Boot_Jdbctemplate - Fatal编程技术网

Java Spring引导JdbcTemplate-禁用语句缓存?

Java Spring引导JdbcTemplate-禁用语句缓存?,java,spring,postgresql,spring-boot,jdbctemplate,Java,Spring,Postgresql,Spring Boot,Jdbctemplate,我有一个Spring引导后端,我使用REST-API与之通信。此后端使用SpringJdbcTemplate连接并执行PostgreSQL数据库上的查询 我发现了一个问题,一个请求在重复了整整10次后,速度明显变慢。我已经将问题缩小到使用JdbcTemplate从数据库检索数据的代码部分。更具体地说,问题发生在每个tomcat工作线程的第二次迭代中: [nio-8080-exec-1] --- GET /myresource - Execution time 400 ms [nio-8080-e

我有一个Spring引导后端,我使用REST-API与之通信。此后端使用Spring
JdbcTemplate
连接并执行PostgreSQL数据库上的查询

我发现了一个问题,一个请求在重复了整整10次后,速度明显变慢。我已经将问题缩小到使用
JdbcTemplate
从数据库检索数据的代码部分。更具体地说,问题发生在每个tomcat工作线程的第二次迭代中:

[nio-8080-exec-1] --- GET /myresource - Execution time 400 ms
[nio-8080-exec-2] --- GET /myresource - Execution time 300 ms
[nio-8080-exec-3] --- GET /myresource - Execution time 285 ms
...
[io-8080-exec-10] --- GET /myresource - Execution time 200 ms
现在,每个tomcat工作人员都接收并处理了一个请求,下一次这些工作人员中的一个接收到相同的请求(使用完全相同的查询)时,执行时间将延长10-15倍:

[nio-8080-exec-1] --- GET /myresource - Execution time 6000 ms
[nio-8080-exec-2] --- GET /myresource - Execution time 5500 ms
[nio-8080-exec-3] --- GET /myresource - Execution time 6700 ms
我尝试过使用psql或pgAdmin运行相同的查询,但没有问题。这让我相信,
JdbcTemplate
正在以某种方式为每个工作者缓存查询,第二次运行查询时,缓存会启动,出于某种原因,它会慢得多,但我不确定。我也尝试过将tomcat改为jetty/undertow,但同样的问题也出现了,所以我相信这一定与
JdbcTemplate
有关

是否有任何方法可以使用
JdbcTemplate
禁用这种类型的缓存,或者是否有其他方法可以避免这种行为

谢谢

编辑:
My application.yaml:

spring:
    datasource:
        platform: postgres
        url: my-jdbc-url
        username: my-user
        password: my-password
代码根据请求中的参数动态创建带有WHERE/AND子句的查询,但相同的请求参数始终创建相同的查询。代码:

公共列表运行查询(MyParams-params){
字符串sql=createSqlFromParams(params);
列表参数=createParamsList(参数);
返回jdbcTemplate.query(sql,params.toArray(),myDatatypeRowMapper());
}
查询结果如下(使用postGIS函数按坐标之间的距离排序):

从my_表中选择*
其中x在[1,2,3]中
y在0到1000之间
z在0到500之间
按geom其他\ U geom订购
限1000;
编辑2:
根据@M.Deinum的建议,添加

spring.datasource.hikari.datasourceproperties.preparedStatementCacheQueries=0
解决了这个问题

假设您在Spring Boot中使用默认连接池HIKARIP,您可以使用
Spring.datasource.hikari.data source属性
来提供其他特定于驱动程序的属性

要禁用,需要包括
preparedStatementCacheQueries
属性,并将值设置为0(默认值为256)

这将禁用整个缓存,并可能影响应用程序的不同区域


这些相关问题似乎暗示您可能希望检查磁盘、索引等,而不是禁用查询缓存。

JdbcTemplate没有缓存任何内容,它只是
javax.sql
包的包装。因此,如果有什么影响的话,是JDBC驱动程序本身或您的数据库设置(spring.datasourceproperties)会影响这一点。您能否将您的
应用程序.properties
以及使用
JdbcTemplate
的代码添加到您的问题中。数字10让我怀疑,因为这是用于连接的默认池大小,所以实际上可能由于不正确使用
JdbcTemplate
而导致连接泄漏。如果您添加
spring.datasource.hikari.maximum pool size=5
,我有一点怀疑。@M.Deinum谢谢您的回复!我为这个问题补充了更多的信息。我尝试将最大池大小更改为5,但在10次请求后问题仍然出现。请尝试将
spring.datasource.hikari.data source properties.preparedStatementCacheQueries=0
添加到
application.properties
这将禁用。可能是地理信息系统的扩展把事情搞砸了。还有,您使用的是哪个驱动程序版本?@M.Deinum我使用的是'org.postgresql:postgresql'驱动程序,postgres版本为12.3,postgis版本为3.0.1。添加
spring.datasource.hikari.datasourceproperties.preparedStatementCacheQueries=0
解决了这个问题!非常感谢你的帮助!我已更新问题以反映这一点。我怎样才能使你的答案成为公认的答案?
spring.datasource.hikari.data-source-properties.preparedStatementCacheQueries=0