我的数据源 bean 正在读取配置属性吗?

问题描述 投票:0回答:0

我正在使用 Spring 2.7.2,几分钟后,当我执行涉及数据库的操作时,我不断收到此 WARN 日志:

HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@ (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value.

所以我确实在此属性中使用了越来越短的值

max-lifetime: 140000
但我不断收到警告,并使用查询检查数据库
show global variables like '%wait_timeout%';
我有以下值:

wait_timeout 我知道那里很重要,它以秒为单位,所以是 10 分钟,我当前的配置是 140000 毫秒,也就是 2 分 20 秒,所以我不应该得到这个 WARN 日志。所以问题是这是我第一次使用数据源 Bean,所以现在我猜问题是它仍然被配置为

max-lifetime
的默认值,因为在 hikari 文档中https://github。 com/brettwoldridge/HikariCP 它说默认值为 1800000(30 分钟),这远高于 mysql 数据库即时连接(10 分钟)的
wait_timeout
值,所以这就是为什么我认为数据源 bean 没有获得配置我在属性中指定,所以这里是 Bean:

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class DataSourceConfig {
    @Bean
    @Qualifier("datasource")
    public DataSource getDataSource(final @Value("${spring.datasource.host}") String host,
            final @Value("${spring.datasource.username}") String user,
            final @Value("${spring.datasource.password}") String password)
            throws DecrypterException {
        return DataSourceBuilder.create().url(String.format(
                "jdbc:mysql://%s/%s?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC&useSSL=false",
                decrypter.getEnv(host), "databasename")).username(user).password(decrypter.getEnv(password)).build();
    }
}

我必须这样做,因为主机和密码是加密的环境变量,只能用特定的库解密,所以我还有其他属性,这里是属性 yml:

spring:
  datasource:
    host: ENCRYPTED_HOST
    username: normal_user
    password: ENCRYPTED_PASSWORD
    driverClassName: com.mysql.cj.jdbc.Driver
    hikari:
      maximum-pool-size: 65
      max-lifetime: 140000
  jpa:
    open-in-view: false
    show-sql: false

我错过了什么吗? Bean 是否无法获取应用程序 yml 中指定的配置?也许由于某种原因在 max-lifetime 属性中指定的时间是秒而不是毫秒? (打算试试这个,但我对此表示怀疑)...

或者也许我需要在 Bean 定义中做这样的事情(?),因为它不会从属性中获取它:

        HikariConfig config = new HikariConfig();
        config.setMaxLifetime(140000);
        config.setMaximumPoolSize(65);
        HikariDataSource source = new HikariDataSource(config);
        DataSourceBuilder builder = DataSourceBuilder.create();
        builder.derivedFrom(source);

如果是这样,我在哪里可以看到一个很好的例子?是否想保留所有默认配置,如果所有配置都是通过 application.yml 而没有数据源 bean,那么通常情况下会是这样,或者默认情况下也是这样吗?提前致谢

java mysql spring spring-boot hikaricp
© www.soinside.com 2019 - 2024. All rights reserved.