我正在使用 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,那么通常情况下会是这样,或者默认情况下也是这样吗?提前致谢