Eu tenho um pequeno aplicativo da web Spring Boot JPA. Ele é implantado no Amazon Beanstalk e usa um Amazon RDS para dados persistentes. No entanto, não é usado com frequência e, portanto, falha depois de um tempo com este tipo de exceção:
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: O último pacote recebido com sucesso do servidor foi 79.870.633 milissegundos atrás.
O último pacote enviado com sucesso ao servidor foi 79.870.634 milissegundos atrás. é mais longo do que o valor configurado pelo servidor de 'wait_timeout'. Você deve considerar expirar e / ou testar a validade da conexão antes de usar em seu aplicativo, aumentando os valores configurados do servidor para tempos limite do cliente ou usando a propriedade de conexão Conector / J 'autoReconnect = true' para evitar esse problema.
Não tenho certeza de como definir essa configuração e não consigo encontrar informações sobre ela em http://spring.io (um site muito bom, no entanto). Quais são algumas idéias ou indicações para informações?
fonte
DataSource
e verificar suas propriedades. stackoverflow.com/a/36586630/148844 Spring Boot não irá configurar automaticamente oDataSource
se você tiver algum@Beans
que defina aDataSource
. docs.spring.io/spring-boot/docs/1.5.16.RELEASE/reference/…Respostas:
Presumo que o boot esteja configurando o
DataSource
para você. Neste caso, e já que você está usando MySQL, você pode adicionar o seguinte ao seuapplication.properties
até 1,3Como djxak observado no comentário, 1.4+ define espaços de nomes específicos para as quatro ligações piscinas da mola de arranque suporta:
tomcat
,hikari
,dbcp
,dbcp2
(dbcp
é suspenso a partir de 1.5). Você precisa verificar qual pool de conexão está usando e se esse recurso é compatível. O exemplo acima era para tomcat, então você teria que escrevê-lo da seguinte maneira em 1.4+:Observe que o uso de não
autoReconnect
é recomendado :fonte
spring.datasource.testOnBorrow
espring.datasource.test-on-borrow
vai funcionar muito bem. Verifique a documentação para mais detalhes.SELECT 1
garante que a conexão foi testada antes de ser entregue ao aplicativo. Com o usotestOnBorrow = true
, os objetos serão validados antes de serem emprestados do pool. Se o objeto falhar na validação, ele será descartado do pool e tentará pegar outro emprestado. NOTA - para um valor verdadeiro ter algum efeito, o parâmetro validationQuery deve ser definido como uma string não nula.tomcat
,hikari
,dbcp
,dbcp2
. Assim, por exemplo, paratomcat-jdbc
pool de conexão, as propriedades devem ser:spring.datasource.tomcat.testOnBorrow=true
espring.datasource.tomcat.validationQuery=SELECT 1
.If you define your own DataSource bean, auto-configuration will not occur.
Segui um guia para OAuth2 e tinha@Bean(name = "OAuth") public DataSource secondaryDataSource()...
e não foi configurado automaticamente nem em usotestOnBorrow
.As sugestões acima não funcionaram para mim. O que realmente funcionou foi a inclusão das seguintes linhas no application.properties
Você pode encontrar a explicação aqui
fonte
A configuração
spring.datasource.tomcat.testOnBorrow=true
em application.properties não funcionou.A configuração programática como abaixo funcionou sem problemas.
fonte
Acabei de mudar para o Spring Boot 1.4 e descobri que essas propriedades foram renomeadas:
fonte
a resposta de whoami é a correta. Usando as propriedades conforme sugerido, não consegui fazer isso funcionar (usando Spring Boot 1.5.3.RELEASE)
Estou adicionando minha resposta, pois é uma classe de configuração completa, então pode ajudar alguém usando Spring Boot:
fonte
Eu tenho um problema semelhante. Spring 4 e Tomcat 8. Eu resolvo o problema com a configuração do Spring
Eu testei. Isso funciona bem! Essas duas linhas fazem tudo para se reconectar ao banco de dados:
fonte
Caso alguém esteja usando DataSource personalizado
As propriedades devem ser semelhantes às seguintes. Observe @ConfigurationProperties com prefixo. O prefixo é tudo antes do nome real da propriedade
Uma referência para Spring Versão 1.4.4.RELEASE
fonte
Como algumas pessoas já apontaram, spring-boot 1.4+, tem namespaces específicos para os quatro pools de conexões. Por padrão, hikaricp é usado no spring-boot 2+. Portanto, você terá que especificar o SQL aqui. O padrão é
SELECT 1
. Aqui está o que você precisa para o DB2, por exemplo:spring.datasource.hikari.connection-test-query=SELECT current date FROM sysibm.sysdummy1
Advertência : se o seu driver suportar JDBC4, recomendamos enfaticamente não definir esta propriedade. Isso é para drivers "legados" que não suportam a API JDBC4 Connection.isValid (). Esta é a consulta que será executada pouco antes de uma conexão do pool ser fornecida a você para validar se a conexão com o banco de dados ainda está ativa. Novamente, tente executar o pool sem essa propriedade, o HikariCP registrará um erro se o seu driver não for compatível com JDBC4 para informá-lo. Padrão: nenhum
fonte
Para aqueles que desejam fazer isso em YAML com várias fontes de dados, há uma ótima postagem no blog sobre isso: https://springframework.guru/how-to-configure-multiple-data-sources-in-a-spring-boot -inscrição/
Basicamente, ele diz que vocês dois precisam configurar as propriedades da fonte de dados e a fonte de dados assim:
Não se esqueça de remover
@Primary
de outras fontes de dados.fonte