Estou adicionando esta resposta para quem chega aqui pesquisando ERROR: cached plan must not change result type
no Google ao tentar resolver o problema no contexto de um aplicativo Java / JDBC.
Consegui reproduzir o erro de forma confiável executando atualizações de esquema (ou seja, instruções DDL) enquanto meu aplicativo de back-end que usava o banco de dados estava em execução. Se o aplicativo estava consultando uma tabela que foi alterada pela atualização do esquema (ou seja, o aplicativo executou consultas antes e depois da atualização em uma tabela alterada) - o driver postgres retornaria este erro porque aparentemente faz o cache de alguns detalhes do esquema.
Você pode evitar o problema configurando seu pgjdbc
driver com autosave=conservative
. Com esta opção, o driver será capaz de liberar quaisquer detalhes que esteja armazenando em cache e você não terá que devolver seu servidor ou liberar seu pool de conexão ou qualquer solução alternativa que possa ter surgido.
Reproduzido no Postgres 9.6 (AWS RDS) e meu teste inicial parece indicar que o problema foi completamente resolvido com esta opção.
Documentação: https://jdbc.postgresql.org/documentation/head/connect.html#connection-parameters
Você pode consultar a pgjdbc
edição 451 do Github para obter mais detalhes e o histórico do problema.
Os usuários do JRuby ActiveRecords veem isso: https://github.com/jruby/activerecord-jdbc-adapter/blob/master/lib/arjdbc/postgresql/connection_methods.rb#L60
Nota sobre o desempenho:
De acordo com os problemas de desempenho relatados no link acima - você deve fazer alguns testes de desempenho / carga / absorção do seu aplicativo antes de ligar cegamente.
Ao fazer o teste de desempenho em meu próprio aplicativo em execução em uma Postgres 10
instância AWS RDS , habilitar a conservative
configuração resulta em uso extra de CPU no servidor de banco de dados. Não foi muito, porém, eu só pude ver a autosave
funcionalidade aparecer como usando uma quantidade mensurável de CPU depois de ajustar cada consulta que meu teste de carga estava usando e começar a forçar o teste de carga.