Spring Boot - 重新启动后重新连接到数据库
Posted
技术标签:
【中文标题】Spring Boot - 重新启动后重新连接到数据库【英文标题】:Spring Boot - Reconnect to a database after its restart 【发布时间】:2020-03-13 23:44:11 【问题描述】:我有一个 Spring Batch 应用程序,它每 10 分钟运行一次。它从 REST API 获取一些数据,然后将这些数据保存在数据库中。
那么,我现在的问题在哪里?
有时数据库 (Oracle) 可能会重新启动或离线(真的不知道)。但是应用程序似乎没有重新连接到数据库。它只是停留在空闲模式。
Spring Boot:2.1.2.RELEASE
application.yml 看起来像这样:
app:
database:
jdbc-url: jdbc:oracle:thin:@<host>:<port>:<db>
username: <username>
password: <password>
driver-class-name: oracle.jdbc.OracleDriver
options:
show-sql: true
ddl-auto: none
dialect: org.hibernate.dialect.Oracle12cDialect
然后,我像这样配置 DataSource:
public DataSource dataSource()
HikariConfig configuration = new HikariConfig();
configuration.setJdbcUrl(properties.getJdbcUrl());
configuration.setUsername(properties.getUsername());
configuration.setPassword(properties.getPassword());
configuration.setDriverClassName(properties.getDriverClassName());
configuration.setLeakDetectionThreshold(60 * 1000);
return new HikariDataSource(configuration);
public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource)
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(dataSource);
em.setPackagesToScan("xxx.xxx.xx");
JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
em.setJpaVendorAdapter(vendorAdapter);
Properties additionalProperties = properties();
em.setJpaProperties(additionalProperties);
return em;
public PlatformTransactionManager transactionManager(EntityManagerFactory emf)
return new JpaTransactionManager(emf);
private Properties properties()
Properties additionalProperties = new Properties();
additionalProperties.setProperty("hibernate.hbm2ddl.auto", properties.getOptions().getDdlAuto());
additionalProperties.setProperty("hibernate.dialect", properties.getOptions().getDialect());
additionalProperties.setProperty("hibernate.show_sql", properties.getOptions().getShowSql());
return additionalProperties;
老实说,我不确定我是否在配置中做错了什么。
谢谢!
【问题讨论】:
您没有多个数据库实例,因此数据库将始终/大部分时间都在运行吗? 多个数据库实例是什么意思?数据库不是由我管理的,据我所知,只有一个数据库实例。 启用空闲连接检查,并启用彼此不同的最小值和最大值。 通常,我们有多个数据库实例在 Oracle RAC 中运行。这是为了高可用性。请通过docs.oracle.com/database/121/HABPT/config_fcf.htm#HABPT5381链接。 @M.Deinum 如何启用空闲连接检查? min 和 max 你的意思可能是 minimumIdle 和 maximumPoolSize? (我指的是Hikari's docu) 【参考方案1】:您应该通过setMaxLifetime 配置maxLifetime 30 分钟
configuration.setMaxLifetime(108000);
属性控制池中连接的最大生命周期。 当连接达到此超时时,即使最近使用过,它也会从池中退出。使用中的连接永远不会被淘汰,只有在空闲时才会被移除。
我们强烈建议设置此值,它应该比任何数据库或基础设施强加的连接时间限制至少少 30 秒。
默认情况下,Oracle 不会为连接强制设置最长生存期
【讨论】:
以上是关于Spring Boot - 重新启动后重新连接到数据库的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot 使用 JdbcTemplate 和多个数据源自动重新连接到 PostgreSQL
服务器重新启动后重新连接到 QDBus 服务器 (Qt C++)
Android/XMPP:连接类型更改后无法重新连接到服务器