Answers:
我弄清楚是什么原因导致此错误。
我的应用程序打开了一个数据库连接,并准备了一条SELECT语句以供执行。
同时,另一个脚本正在修改数据库表,更改上述SELECT语句中返回的列之一的数据类型。
我通过修改数据库表后重新启动应用程序来解决此问题。这将重置数据库连接,从而使准备好的语句能够正确执行。
org.postgresql.util.PSQLException: ERROR: cached plan must not change result type
。并且所有测试都像魅力一样,但仅限于Repository.findById()
。我没有在测试中更改架构,但是我正在@FlywayTest
为每个测试准备一个测试初始化数据库。如果删除@FlywayTest
注释,则效果很好。
我ERROR: cached plan must not change result type
在尝试解决Java / JDBC应用程序上下文中的问题时通过谷歌搜索着陆的人添加此答案。
当我使用DB的后端应用程序正在运行时,通过运行模式升级(即DDL语句),我能够可靠地重现该错误。如果应用程序正在查询已被架构升级更改的表(即,应用程序在已更改表的升级之前和之后运行查询)-postgres驱动程序将返回此错误,因为显然它确实缓存了某些架构详细信息。
您可以通过使用配置pgjdbc
驱动程序来避免此问题autosave=conservative
。使用此选项,驱动程序将能够刷新其缓存的任何详细信息,并且您不必弹跳服务器或刷新连接池或您可能想出的任何解决方法。
转载于Postgres 9.6(AWS RDS),我的初步测试似乎表明使用此选项可以完全解决问题。
说明文件: https //jdbc.postgresql.org/documentation/head/connect.html#connection-parameters
您可以查看pgjdbc
Github第451期,以了解更多详细信息和历史记录。
JRuby ActiveRecords用户可以看到以下内容:https : //github.com/jruby/activerecord-jdbc-adapter/blob/master/lib/arjdbc/postgresql/connection_methods.rb#L60
关于性能的注意事项:
根据上面链接中报告的性能问题-您应该对应用程序进行一些性能/负载/浸泡测试,然后再盲目打开。
在运行于AWS RDS Postgres 10
实例上的我自己的应用程序上进行性能测试时,启用该conservative
设置确实会导致数据库服务器上额外的CPU使用率。虽然不多,但autosave
在调整负载测试正在使用的每个查询并开始努力推动负载测试之后,我什至只能看到功能显示为使用了可测量的CPU。