Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.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/0/mercurial/2.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 博士后:“;错误:缓存的计划不能更改结果类型;_Postgresql - Fatal编程技术网

Postgresql 博士后:“;错误:缓存的计划不能更改结果类型;

Postgresql 博士后:“;错误:缓存的计划不能更改结果类型;,postgresql,Postgresql,PostgreSQL 8.3.7服务器将此异常抛出到我的应用程序。 有人知道这个错误是什么意思吗?我能做些什么 ERROR: cached plan must not change result type STATEMENT: select code,is_deprecated from country where code=$1 我找到了导致这个错误的原因 我的应用程序打开了一个数据库连接,并准备了一个SELECT语句以供执行 同时,另一个脚本正在修改数据库表,更改上述SELECT语句中

PostgreSQL 8.3.7服务器将此异常抛出到我的应用程序。 有人知道这个错误是什么意思吗?我能做些什么

ERROR:  cached plan must not change result type
STATEMENT:  select code,is_deprecated from country where code=$1

我找到了导致这个错误的原因

我的应用程序打开了一个数据库连接,并准备了一个SELECT语句以供执行

同时,另一个脚本正在修改数据库表,更改上述SELECT语句中返回的一列的数据类型


我通过在修改数据库表后重新启动应用程序解决了这个问题。这将重置数据库连接,使准备好的语句能够无错误地执行。

我为通过谷歌
ERROR登录到这里的任何人添加了这个答案:在Java/JDBC应用程序上下文中尝试解决问题时,缓存计划不得更改结果类型

我能够在使用DB的后端应用程序运行时,通过运行模式升级(即DDL语句)可靠地再现错误。如果应用程序正在查询架构升级更改的表(即,应用程序在升级之前和之后对更改的表运行查询),postgres驱动程序将返回此错误,因为显然它不会缓存某些架构详细信息

通过将
pgjdbc
驱动程序配置为
autosave=conservative
,可以避免此问题。使用此选项,驱动程序将能够刷新它正在缓存的任何详细信息,您不必跳转服务器或刷新连接池,也不必刷新您可能想到的任何解决方法

在Postgres 9.6(AWS RDS)上复制,我的初始测试似乎表明该选项完全解决了问题

文件:

您可以查看
pgjdbc
,了解该问题的更多详细信息和历史记录


JRuby ActiveRecords用户可以看到:


关于业绩的说明:

根据上面链接中报告的性能问题-在盲目打开之前,您应该对应用程序进行一些性能/负载/浸泡测试


在AWS RDS
Postgres 10
实例上运行我自己的应用程序进行性能测试时,启用
conservative
设置确实会导致数据库服务器上额外的CPU使用。虽然没有太多,但在我调整了负载测试使用的每个查询并开始大力推动负载测试之后,我甚至只能看到
autosave
功能显示为使用了可测量的CPU量。

对于我们来说,我们也面临着类似的问题。我们的应用程序在多个模式上工作。每当我们进行模式更改时,这个问题就开始出现


在JDBC参数中设置prepareThreshold=0将禁用数据库级别的语句缓存。这为我们解决了问题

我是在PostgreSQL 9.0.4和Ruby on Rails 3.1-pre5上得到的。这似乎应该由ActiveRecord自动处理,不是吗?是的,我希望ActiveRecord最终会处理这个问题。我相信,如果你不想重新启动,调用MyModel.reset\u column\u information可以在短期内解决问题。我浪费了一个小时来找出哪里出了问题。你的回答救了我!您知道有任何解决方案不需要重新启动all应用程序或postgres服务器吗?也许有什么解决方案可以在错误发生时手动清除缓存计划?我在Postgres 10上运行spring+jpa应用程序的JUnit测试时遇到了同样的问题。异常消息:
org.postgresql.util.psql异常:错误:缓存的计划不能更改结果类型
。所有测试都像一个符咒一样工作,但只有
Repository.findById()
。我没有在测试中更改模式,但我正在使用
@FlywayTest
为每个测试准备一个test init数据库。如果我删除了
@FlywayTest
注释,它工作得很好。您能分享PostreSQL的确切版本吗?8.3.X?为什么这不是默认值?按照广告的方式工作。我的简单测试没有显示任何性能影响。如何使用Ruby Postgres driver配置它?@Hrishi您的评论让我意识到最初的问题实际上并没有指定Java(因为我在Java环境中处理问题时发现了它)。我想说,您可能想发布一个全新的问题,明确地在Ruby上下文中寻找解决方案。@cdmckay,因为它是在9.4-ish版本的时间范围内引入驱动程序的新功能。就我个人而言,如果某个新版本的pgjdbc破坏了我的应用程序,我会非常不高兴,因为它默认启用了我不需要的新的、未经验证的、性能降低的功能。(这就是说,这是我的“创建新应用程序时始终这样做”清单上的一个新条目)。这就是我的想法。我改为使用“preparedStatementCacheQueries=0”。