Postgres:"错误:缓存计划不得更改结果类型"

Jin*_*Kim 99 postgresql

PostgreSQL 8.3.7服务器将此异常抛给我的应用程序.有谁知道这个错误意味着什么,我能做些什么呢?

ERROR:  cached plan must not change result type
STATEMENT:  select code,is_deprecated from country where code=$1
Run Code Online (Sandbox Code Playgroud)

Jin*_*Kim 169

我弄清楚是什么导致了这个错误.

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

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

我通过在修改数据库表后重新启动应用程序来解决此问题.这会重置数据库连接,允许预准备语句无错误地执行.

  • 我在PostgreSQL 9.0.4上使用Ruby on Rails 3.1-pre5获得了这个.似乎应该由ActiveRecord自动处理,不是吗? (3认同)
  • 是的,我希望ActiveRecord最终能够解决这个问题.我相信如果你想避免重启,调用MyModel.reset_column_information会在短期内解决问题. (3认同)
  • 您知道任何解决方案都不需要重新启动所有应用程序或postgres服务器吗?也许有一些解决方案可以在发生错误时手动清除缓存计划? (3认同)
  • 我解决了 Binakot 问题,将“?preparedStatementCacheQueries=0”添加到 JDBC URL 以禁用准备好的语句缓存。错误是由于 @Flytest 在缓存语句和重用它之间清除并重新创建架构造成的。 (3认同)
  • 在为 spring+jpa 应用程序运行 JUnit 测试时,我在 Postgres 10 上遇到了同样的问题。异常消息:`org.postgresql.util.PSQLException:错误:缓存计划不得更改结果类型`。所有测试都像魅力一样工作,但只有“Repository.findById()”。我没有更改测试中的架构,但我使用 `@FlywayTest` 为每个测试准备一个测试初始化​​数据库。如果我删除`@FlywayTest` 注释,它运行良好。 (2认同)

Sho*_*orn 19

我正在通过谷歌搜索为这里的任何人添加这个答案ERROR: cached plan must not change result type.

您可以通过配置pgjdbc驱动程序来避免此问题autosave=conservative.使用此选项,您不必退回服务器或刷新连接池或您可能提出的任何解决方法.

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

文档:https://jdbc.postgresql.org/documentation/head/connect.html#connection-parameters

您可以查看pgjdbc Github问题451以获取更多详细信息和问题的历史记录.

请注意,根据上述链接中报告的性能问题 - 在盲目切换之前,您应该对应用程序进行一些性能/负载/浸泡测试.

  • 为什么这不是默认值? (5认同)

小智 5

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

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