Spring Boot 应用程序忽略了 hikaricp 配置



我是堆栈溢出的新手,但是现在在这里阅读了大量帖子,stuck.my 读取了application.properties,但是配置hikaricp的部分被忽略/没有效果。

我读了 https://www.javadevjournal.com/spring-boot/spring-boot-hikari/,并在那里写下了这些步骤,仍然取得了任何成功。

绒球.xml

<dependencies>  
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId>
<version>5.4.10.Final</version>
<exclusions>
<exclusion>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
</exclusion>
</exclusions>
</dependency>    
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-jcache</artifactId>
<version>5.4.10.Final</version>
</dependency>
<dependency>
<groupId>org.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>3.6.3</version>
</dependency>        
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
<exclusions>
<exclusion>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jdbc</artifactId>
</exclusion>                
</exclusions>
<version>2.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<exclusions>
<exclusion>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jdbc</artifactId>
</exclusion>
</exclusions>
<version>2.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jdbc</artifactId>
</exclusion>
</exclusions>
<version>2.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<exclusions>
<exclusion>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jdbc</artifactId>
</exclusion>
</exclusions>
<scope>test</scope>
<version>2.2.2.RELEASE</version>
</dependency>

应用程序属性

spring.cache.jcache.config=classpath:ehcache.xml
spring.datasource.jdbc-url=jdbc:postgresql://VOC-APP202-db:5432/voice-app
spring.datasource.username=vocapp202
spring.datasource.password=******
srping.datasource.driver-class-name=org.postgresql.Driver       
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.hikari.connectionTimeout=1000
spring.datasource.hikari.idleTimeout=30000
spring.datasource.hikari.maxLifetime=60000
spring.datasource.hikari.connectionTestQuery=SELECT * FROM table where id=1
spring.datasource.hikari.minimumIdle=1
spring.datasource.hikari.maximumPoolSize=5
spring.datasource.hikari.poolName=voiceapp-db-pool
spring.datasource.hikari.autoCommit=false

黑名单申请.class:

package de.mycompany.voice.blacklist_ng;  
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;   
@SpringBootApplication
@EnableJpaAuditing
@EnableCaching
@Configuration
public class BlacklistngApplication {
public static void main(String[] args) {
SpringApplication.run(BlacklistngApplication.class, args);
}
}

配置类:

@Configuration
@ConfigurationProperties("spring.datasource")
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef = "entityManagerFactory",
basePackages = {"de.firsttelecom.voice.blacklist_ng.repository.vocapp202"}
)
public class VocApp202DbConfig extends HikariConfig {
@Primary
@Bean(name = "dataSource")
public DataSource dataSource() {
return new HikariDataSource(this);
}

我错过了什么?

spring.datasource.hikari.*

(以及spring.datasource.url(属性仅在使用 Spring 引导数据源自动配置时才有效。为了实现它,您需要删除此 bean:

@Primary
@Bean(name = "dataSource")
public DataSource dataSource() {
return new HikariDataSource(this);
}

Spring Boot 将使用所有这些属性自动为您创建它。您可以查看DataSourceAutoConfiguration.class以获取更多信息。

如果由于某种原因您无法删除此 bean(例如,您有另一堆数据源,并且您需要创建手动数据源以将其标记为@Primary(,您可以使用"原始"属性来配置 hikari。因此,您应该通过删除hikari.部分来修改属性,而不是删除dataSource()方法:

...
spring.datasource.jdbc-url=jdbc:postgresql://VOC-APP202-db:5432/voice-app
...
spring.datasource.connectionTimeout=1000
spring.datasource.idleTimeout=30000
spring.datasource.maxLifetime=60000
spring.datasource.connectionTestQuery=SELECT * FROM table where id=1
spring.datasource.minimumIdle=1
spring.datasource.maximumPoolSize=5
spring.datasource.poolName=voiceapp-db-pool
spring.datasource.autoCommit=false

jdbc-url也是光特定的属性,这就是它现在工作的原因。

总结一下:不带hikari.且带jdbc-url的属性用于手动创建的数据源 bean,以及具有hikari.url的属性用于 Spring 引导数据源自动配置。

如果您已经在使用具有 hikari 和数据源配置的应用程序属性文件,那么当您使用新的 HikariDataSource(this(时,它将覆盖您的 application.properties 值。

您可以手动创建 HikariDataSource,然后从 application.properties 中删除:

@Bean(name = "dataSource")
public DataSource dataSource() {
HikariDataSource hikariDataSource = new HikariDataSource();
hikariDataSource.setMaximumPoolSize(5);
hikariDataSource.setMaxLifetime(60000);
hikariDataSource.setMinimumIdle(1);
//.. some other configs
return hikariDataSource;
}

或仅使用应用程序属性值。

若要将配置保留为标准格式,并且仍显式创建数据源,可以将特定于连接池的前缀用于配置属性。这与使用自动配置时弹簧引导数据源配置所做的相同:

@Bean
@Primary
@ConfigurationProperties(prefix = "spring.datasource")
public DataSourceProperties dataSourceProperties() {
return new DataSourceProperties();
}
@Bean
@Primary
@ConfigurationProperties(prefix = "spring.datasource.hikari")
public HikariDataSource dataSource(DataSourceProperties properties) {
HikariDataSource dataSource = properties.initializeDataSourceBuilder().type(HikariDataSource.class).build();
if (StringUtils.hasText(properties.getName())) {
dataSource.setPoolName(properties.getName());
}
return dataSource;
}

样本application.yaml

spring:
datasource:
url: jdbc:postgresql://localhost:5432/postgres?gssEncMode=disable
username: postgres
password: postgres
hikari:
minimumIdle: 0
maximumPoolSize: 50
idleTimeout: 90000
maxLifetime: 900000
connectionTimeout: 45000
leakDetectionThreshold: 45000

但是有些东西不适用于application.properties,所以我现在做了: DbConfig.class(es(

@Primary
@Bean(name = "dataSource")
public DataSource dataSource() {
HikariConfig config = new HikariConfig("/hikari_voiceapp.properties");
//HikariDataSource dataSource = new HikariDataSource(config);
return new HikariDataSource(config);
}

并在单独的 hikari.properties 文件中指定每个数据库的所有参数,包括数据库的名称:

hikari_asterisk.properties
hikari_billing.properties
hikari_voiceapp.properties

为我工作。

我使用了以下方法

second.datasource.jdbc-url=jdbc-url
second.datasource.username=username
second.datasource.password=password
.
.
.
.

===================在 Java 配置文件中 ===

==================
@Bean(name = "secondDataSource")
@ConfigurationProperties(prefix = "second.datasource")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "secondEntityManagerFactory")
public LocalContainerEntityManagerFactoryBean barEntityManagerFactory(EntityManagerFactoryBuilder builder,
@Qualifier("secondDataSource") DataSource dataSource) {
Map<String, String> props = new HashMap<String, String>();
props.put("spring.jpa.database-platform",  "org.hibernate.dialect.Oracle12cDialect");
.
.
.
return builder.dataSource(dataSource).packages("com.second.entity").persistenceUnit("secondDB")
.properties(props)
.build();
}
@Bean(name = "secondTransactionManager")
public PlatformTransactionManager secondTransactionManager(
@Qualifier("secondEntityManagerFactory") EntityManagerFactory secondEntityManagerFactory) {
return new JpaTransactionManager(secondEntityManagerFactory);
}

我也面临这个问题。我喜欢这个解决方案:

我的应用程序.yml

spring:
db1:
datasource:
jdbc-url: 'jdbc:postgresql://${DB_HOST:localhost}:${DB_PORT:5432}/${DB_NAME:postgres}'
username: ${PG_USER}
password: ${PG_PASS}
driver-class-name: org.postgresql.Driver
schema: file_integration_manager_dev
maximum-pool-size: 2
connection-timeout: 30000
max-lifetime: 45000

我的结果配置bean文件:

@Bean(name = "datasource1")
@ConfigurationProperties(prefix = "spring.db1.datasource")
public DataSource dataSource() {
return new HikariDataSource();
}

在最新的 springboot 版本中,不需要在配置中指定 hikari。 属性应具有连字符 (-(

replace spring.datasource.hikari.maximumPoolSize=5
with spring.datasource.maximum-pool-size=5

最新更新