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

重启后重新连接到 Redis

服务器重新启动后重新连接到 QDBus 服务器 (Qt C++)

Android/XMPP:连接类型更改后无法重新连接到服务器

Spring Boot Starter-Web 尝试在启动时连接到 Mongo

加入 *** 后 AWS RDP 断开连接 [关闭]