Spring Boot JPA 连接验证不起作用

Posted

技术标签:

【中文标题】Spring Boot JPA 连接验证不起作用【英文标题】:Spring Boot JPA connection validation not working 【发布时间】:2014-08-16 10:42:18 【问题描述】:

我目前正在调试一个使用 spring boot(1.1.2.Release) 构建的小型应用程序。如果连接丢失(由于生产中的 wait_timeout 或开发中的连接中断),我在重新连接到数据库时遇到问题。我目前正在使用以下配置参数(application.properties):

spring.datasource.url=jdbc:mysql://localhost:3306/test?autoreconnect=true
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.test-on-borrow=true
spring.datasource.test-while-idle=true
spring.datasource.validation-query=SELECT 1;
spring.datasource.initial-size=2
... username+pw

spring.jpa.generate-ddl=true
spring.jpa.show-sql=true

这会产生以下数据源:

org.apache.tomcat.jdbc.pool.DataSource@73e369e5ConnectionPool[
defaultAutoCommit=null;
defaultReadOnly=null;
defaultTransactionIsolation=-1;
defaultCatalog=null;
driverClassName=com.mysql.jdbc.Driver;
maxActive=100;
maxIdle=100;
minIdle=10;
initialSize=2;
maxWait=30000;
testOnBorrow=true;
testOnReturn=false;
timeBetweenEvictionRunsMillis=5000;
numTestsPerEvictionRun=0;
minEvictableIdleTimeMillis=60000;
testWhileIdle=true;
testOnConnect=false;
password=********;
url=jdbc:mysql://localhost:3306/test?autoreconnect=true;
username=test;
validationQuery=SELECT 1;
;
validationQueryTimeout=-1;
validatorClassName=null;
validationInterval=30000;
accessToUnderlyingConnectionAllowed=true;
removeAbandoned=false;
removeAbandonedTimeout=60;
logAbandoned=false;
connectionProperties=null;
initSQL=null;
jdbcInterceptors=null;
jmxEnabled=true;
fairQueue=true;
useEquals=true;
abandonWhenPercentageFull=0;
maxAge=0;
useLock=false;
dataSource=null;
dataSourceJNDI=null;
suspectTimeout=0;
alternateUsernameAllowed=false;
commitOnReturn=false;
rollbackOnReturn=false;
useDisposableConnectionFacade=true;
logValidationErrors=false;
propagateInterruptState=false;
ignoreExceptionOnPreLoad=false;

我现在的问题是,当连接丢失时,需要很长时间才能重新建立连接。同时,用户得到一个空页面,并且在服务器端抛出异常。据我了解,testOnBorrow 应该在每次使用前测试连接,并且每 30 秒测试一次 testWhileIdle。但显然情况并非如此。当我查看 mysql 时,似乎每 35 秒就会发生一次事情并且睡眠时间会重置,但我在应用程序日志中看不到任何查询。验证查询似乎完全丢失了。

我通过 spring data 的存储库访问数据库。

我目前没有进一步的想法可以尝试什么。

【问题讨论】:

根据这个***.com/questions/667289/…,这更像是一个普遍的问题。我什至怀疑没有弹簧启动它是否能正常工作,因为数据源似乎配置正确。 使用 autoreconnect=true 更像是抓住最后一根稻草,希望它能有所帮助。我知道它会引发异常,但我的理解是连接池(tomcat-jdbc)由于验证查询而应该被捕获并重新连接到数据库,即使没有 autoreconnect=true。 您可以做什么而不是验证借用,您可能希望定期测试连接并驱逐废弃/空闲连接。见tomcatexpert.com/blog/2010/04/01/… 谢谢您,我认为这对您有很大帮助。下次有机会我会试一试的。 我认为您不能将它们放在 application.properties 中。您是否在某处配置了 org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean bean?把它放在它引用的数据源bean中 【参考方案1】:

尝试将连接池换成HikariCP 而不是tomcat,因为它似乎可以处理超时/连接丢失a lot better。如果类路径中存在 HikariCP 而tomcat-jdbc 不存在,Spring Boot 将自动配置 HikariCP。

【讨论】:

以上是关于Spring Boot JPA 连接验证不起作用的主要内容,如果未能解决你的问题,请参考以下文章

使用 Spring Boot 和 Spring Data JPA 批量插入不起作用

使用 spring boot JPA hibernate 存储库检查用户名和密码的 Mysql 查询不起作用。我该怎么办?

在 Spring Boot 应用程序上添加 jpa 依赖项时,Okta Spring Boot 不起作用

Spring boot、JPA、Hibernate 和 H2 DB 测试 - 序列不起作用 - 意外的代码路径”;SQL 语句:调用 seq_my_jobs [50000-193] 的下一个值

Spring boot jpa H2兼容模式MYSQL不起作用

JPA 自动完成功能在 Intellij spring-boot kotlin 项目中不起作用