我试图在我的Spring Boot(1.2.0.M1)应用程序中设置HikariCP,因此我可以使用它来代替Tomcat DBCP进行测试。我想在我的application.properties文件中配置连接池,就像我在使用Tomcat一样,但我无法弄清楚我应该怎么做。我发现的所有示例都显示了JavaConfig样式,或者使用单独的HikariCP属性文件。有人可以帮我弄清楚在application.properties中配置它的属性名吗?我也希望从使用driverClassName方法切换到DataSourceClassName方法,因为它看起来更干净并且是推荐的。这在我的application.properties文件中也可以吗?
这是我对Tomcat DBCP的看法(只是一些基本的配置,没有完全刷新)
spring.datasource.validation-query=SELECT 1
spring.datasource.max-active=10
spring.datasource.max-idle=8
spring.datasource.min-idle=8
spring.datasource.initial-size=5
spring.datasource.test-on-borrow=true
spring.datasource.test-on-return=true
我目前正在使用driverClassName和jdbc url来设置连接:
spring.datasource.url=jdbc:mysql://localhost:3306/myDb
spring.datasource.driverClassName=com.mysql.jdbc.Driver
答案 0 :(得分:108)
@Configuration
@ConfigurationProperties(prefix = "params.datasource")
public class JpaConfig extends HikariConfig {
@Bean
public DataSource dataSource() throws SQLException {
return new HikariDataSource(this);
}
}
<强> application.yml 强>
params:
datasource:
driverClassName: com.mysql.jdbc.Driver
jdbcUrl: jdbc:mysql://localhost:3306/myDb
username: login
password: password
maximumPoolSize: 5
<强>已更新!从Spring Boot 1.3.0版本开始:
<强> application.yml 强>
spring:
datasource:
type: com.zaxxer.hikari.HikariDataSource
url: jdbc:h2:mem:TEST
driver-class-name: org.h2.Driver
username: username
password: password
hikari:
idle-timeout: 10000
<强>已更新!从Spring Boot 2.0.0版本开始:
默认连接池已从Tomcat更改为Hikari:)
答案 1 :(得分:21)
您只能使用application.yml / application.properties。无需显式创建任何DataSource
Bean
您需要排除ydemartino
所提及的tomcat-jdbc<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>
</dependency>
由于您不会创建DataSource
bean,因此必须在application.yml / application.properties
spring.datasource.type
的{{1}}显式指定Hikari
com.zaxxer.hikari.HikariDataSource
在application.yml / application.properties中,您可以在spring:
datasource:
hikari:
connection-test-query: SELECT 1 FROM DUAL
minimum-idle: 1
maximum-pool-size: 5
pool-name: yourPoolName
auto-commit: false
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/myDb
username: login
password: password
type: com.zaxxer.hikari.HikariDataSource
答案 2 :(得分:20)
我偶然发现HikariCP
并且我对基准测试感到惊讶,我想尝试而不是默认选择C3P0
而且我很惊讶我努力让configurations
正确因为配置根据您使用的技术堆栈的组合而不同。
我已设置Spring Boot
项目JPA, Web, Security
启动器(使用Spring Initializer)将PostgreSQL
用作HikariCP
作为连接池的数据库。
我使用Gradle
作为构建工具,我想分享对我有用的内容,以便进行以下假设:
如果您使用的是build.gradle
或等效的Gradle
,则需要以下pom.xml
buildscript {
ext {
springBootVersion = '1.5.8.RELEASE'
}
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'war'
group = 'com'
version = '1.0'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
compile('org.springframework.boot:spring-boot-starter-aop')
// Exclude the tomcat-jdbc since it's used as default for connection pooling
// This can also be achieved by setting the spring.datasource.type to HikariCP
// datasource see application.properties below
compile('org.springframework.boot:spring-boot-starter-data-jpa') {
exclude group: 'org.apache.tomcat', module: 'tomcat-jdbc'
}
compile('org.springframework.boot:spring-boot-starter-security')
compile('org.springframework.boot:spring-boot-starter-web')
runtime('org.postgresql:postgresql')
testCompile('org.springframework.boot:spring-boot-starter-test')
testCompile('org.springframework.security:spring-security-test')
// Download HikariCP but, exclude hibernate-core to avoid version conflicts
compile('com.zaxxer:HikariCP:2.5.1') {
exclude group: 'org.hibernate', module: 'hibernate-core'
}
// Need this in order to get the HikariCPConnectionProvider
compile('org.hibernate:hibernate-hikaricp:5.2.11.Final') {
exclude group: 'com.zaxxer', module: 'HikariCP'
exclude group: 'org.hibernate', module: 'hibernate-core'
}
}
以上build.gradle
中有一堆排除,那是因为
jdbc-tomcat
依赖项时排除spring-boot-starter-data-jpa
连接池的gradle。这可以通过设置spring.datasource.type=com.zaxxer.hikari.HikariDataSource
来实现,但如果我不需要它,我不想要额外的依赖hibernate-core
依赖项时排除com.zaxxer
,因为hibernate-core
已经Spring Boot
已下载,我们不希望最终不同的版本。 hibernate-core
模块时排除hibernate-hikaricp
,以使HikariCP使用org.hibernate.hikaricp.internal.HikariCPConnectionProvider
作为连接提供程序而非弃用com.zaxxer.hikari.hibernate.HikariConnectionProvider
一旦我弄明白build.gradle
以及要保留什么以及不保留什么,我就准备好将datasource
配置复制/粘贴到我的application.properties
中,并期望一切都能与飞行一起使用颜色,但不是真的,我偶然发现了以下问题
com.zaxxer.hikari.hibernate.HikariConnectionProvider
key/value
中寻找一些application.properties
并抱怨dataSource, dataSourceClassName, jdbcUrl
。我必须调试HikariConfig, HikariConfigurationUtil, HikariCPConnectionProvider
并发现HikariCP
找不到application.properties
的属性,因为它的名称不同。 无论如何,这是我不得不依赖试验和错误的地方,并确保HikariCP
能够选择属性(即数据源的db详细信息,以及池属性)以及Sping Boot行为与预期一致,我最终得到了以下application.properties
文件。
server.contextPath=/
debug=true
# Spring data source needed for Spring boot to behave
# Pre Spring Boot v2.0.0.M6 without below Spring Boot defaults to tomcat-jdbc connection pool included
# in spring-boot-starter-jdbc and as compiled dependency under spring-boot-starter-data-jpa
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.url=jdbc:postgresql://localhost:5432/somedb
spring.datasource.username=dbuser
spring.datasource.password=dbpassword
# Hikari will use the above plus the following to setup connection pooling
spring.datasource.hikari.minimumIdle=5
spring.datasource.hikari.maximumPoolSize=20
spring.datasource.hikari.idleTimeout=30000
spring.datasource.hikari.poolName=SpringBootJPAHikariCP
spring.datasource.hikari.maxLifetime=2000000
spring.datasource.hikari.connectionTimeout=30000
# Without below HikariCP uses deprecated com.zaxxer.hikari.hibernate.HikariConnectionProvider
# Surprisingly enough below ConnectionProvider is in hibernate-hikaricp dependency and not hibernate-core
# So you need to pull that dependency but, make sure to exclude it's transitive dependencies or you will end up
# with different versions of hibernate-core
spring.jpa.hibernate.connection.provider_class=org.hibernate.hikaricp.internal.HikariCPConnectionProvider
# JPA specific configs
spring.jpa.properties.hibernate.show_sql=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.use_sql=true
spring.jpa.properties.hibernate.id.new_generator_mappings=false
spring.jpa.properties.hibernate.default_schema=dbschema
spring.jpa.properties.hibernate.search.autoregister_listeners=false
spring.jpa.properties.hibernate.bytecode.use_reflection_optimizer=false
# Enable logging to verify that HikariCP is used, the second entry is specific to HikariCP
logging.level.org.hibernate.SQL=DEBUG
logging.level.com.zaxxer.hikari.HikariConfig=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
如上所示,配置根据以下命名模式分为几类
很难找到教程或帖子或某些资源,它们显示了如何使用上述属性文件以及如何命名属性。好吧,你有它。
将带有application.properties
(或至少类似)build.gradle
的{{1}}投入Spring Boot JPA项目版本(1.5.8)应该像魅力一样工作并连接到预先配置的数据库(即在我的情况下,它是PostgreSQL,HikariCP & Spring
从spring.datasource.url
中找出要使用的数据库驱动程序。
我没有看到创建DataSource
bean的必要性,因为Spring Boot能够通过调查application.properties
来完成所有事情,而且很简单。
HikariCP的github article中的wiki显示了如何使用JPA设置Spring Boot,但缺乏解释和细节。
以上两个文件也可作为公开要点https://gist.github.com/rhamedy/b3cb936061cc03acdfe21358b86a5bc6
答案 3 :(得分:7)
这适用于我的启动应用程序,以防它有用。该类告诉您配置对象要查找的属性:
我认为通过将datasource_whatever
添加到源配置文件中的属性键可以支持多个数据源。干杯!
@Configuration
class DataSourceConfig {
@Value('${spring.datasource.username}')
private String user;
@Value('${spring.datasource.password}')
private String password;
@Value('${spring.datasource.url}')
private String dataSourceUrl;
@Value('${spring.datasource.dataSourceClassName}')
private String dataSourceClassName;
@Value('${spring.datasource.connectionTimeout}')
private int connectionTimeout;
@Value('${spring.datasource.maxLifetime}')
private int maxLifetime;
@Bean
public DataSource primaryDataSource() {
Properties dsProps = [url: dataSourceUrl, user: user, password: password]
Properties configProps = [
connectionTestQuery: 'select 1 from dual',
connectionTimeout: connectionTimeout,
dataSourceClassName: dataSourceClassName,
dataSourceProperties: dsProps,
maxLifetime: maxLifetime
]
// A default max pool size of 10 seems reasonable for now, so no need to configure for now.
HikariConfig hc = new HikariConfig(configProps)
HikariDataSource ds = new HikariDataSource(hc)
ds
}
}
答案 4 :(得分:7)
您不需要使用冗余代码将属性值放入变量。您可以直接使用属性文件设置属性。
将hikari.properties
文件放在类路径中。
driverClassName=com.mysql.jdbc.Driver
jdbcUrl=jdbc:mysql://localhost:3306/myDb
connectionTestQuery=SELECT 1
maximumPoolSize=20
username=...
password=...
制作这样的数据源bean。
@Bean(destroyMethod = "close")
public DataSource dataSource() throws SQLException {
HikariConfig config = new HikariConfig("/hikari.properties");
HikariDataSource dataSource = new HikariDataSource(config);
return dataSource;
}
答案 5 :(得分:6)
你不能在@Andy Wilkinson所说的application.properties配置中使用dataSourceClassName方法。如果你想拥有dataSourceClassName,你可以使用Java Config:
@Configuration
@ComponentScan
class DataSourceConfig {
@Value("${spring.datasource.username}")
private String user;
@Value("${spring.datasource.password}")
private String password;
@Value("${spring.datasource.url}")
private String dataSourceUrl;
@Value("${spring.datasource.dataSourceClassName}")
private String dataSourceClassName;
@Value("${spring.datasource.poolName}")
private String poolName;
@Value("${spring.datasource.connectionTimeout}")
private int connectionTimeout;
@Value("${spring.datasource.maxLifetime}")
private int maxLifetime;
@Value("${spring.datasource.maximumPoolSize}")
private int maximumPoolSize;
@Value("${spring.datasource.minimumIdle}")
private int minimumIdle;
@Value("${spring.datasource.idleTimeout}")
private int idleTimeout;
@Bean
public DataSource primaryDataSource() {
Properties dsProps = new Properties();
dsProps.put("url", dataSourceUrl);
dsProps.put("user", user);
dsProps.put("password", password);
dsProps.put("prepStmtCacheSize",250);
dsProps.put("prepStmtCacheSqlLimit",2048);
dsProps.put("cachePrepStmts",Boolean.TRUE);
dsProps.put("useServerPrepStmts",Boolean.TRUE);
Properties configProps = new Properties();
configProps.put("dataSourceClassName", dataSourceClassName);
configProps.put("poolName",poolName);
configProps.put("maximumPoolSize",maximumPoolSize);
configProps.put("minimumIdle",minimumIdle);
configProps.put("minimumIdle",minimumIdle);
configProps.put("connectionTimeout", connectionTimeout);
configProps.put("idleTimeout", idleTimeout);
configProps.put("dataSourceProperties", dsProps);
HikariConfig hc = new HikariConfig(configProps);
HikariDataSource ds = new HikariDataSource(hc);
return ds;
}
}
你无法使用dataSourceClassName,因为它会抛出异常
Caused by: java.lang.IllegalStateException: both driverClassName and dataSourceClassName are specified, one or the other should be used.
表示spring boot从spring.datasource.url属性推断Driver,同时设置dataSourceClassName会创建此异常。为了使其正确,您的application.properties对于HikariCP数据源看起来应该是这样的:
# hikariCP
spring.jpa.databasePlatform=org.hibernate.dialect.MySQLDialect
spring.datasource.url=jdbc:mysql://localhost:3306/exampledb
spring.datasource.username=root
spring.datasource.password=
spring.datasource.poolName=SpringBootHikariCP
spring.datasource.maximumPoolSize=5
spring.datasource.minimumIdle=3
spring.datasource.maxLifetime=2000000
spring.datasource.connectionTimeout=30000
spring.datasource.idleTimeout=30000
spring.datasource.pool-prepared-statements=true
spring.datasource.max-open-prepared-statements=250
注意:请检查类路径中是否有任何tomcat-jdbc.jar或commons-dbcp.jar是否通过传递依赖添加了大部分时间。如果这些存在于类路径中,则Spring Boot将使用默认连接池(即tomcat)配置数据源。如果类路径中没有其他提供程序,HikariCP将仅用于创建数据源。有来自tomcat的后备序列 - &gt;到HikariCP - &gt;到Commons DBCP。
答案 6 :(得分:5)
您可以使用dataSourceClassName方法,这是MySQL的一个示例。 (用弹簧靴1.3和1.4测试)
首先,您需要从类路径中排除tomcat-jdbc,因为它将被选中以支持hikaricp。
的pom.xml
<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>
</dependency>
application.properties
spring.datasource.dataSourceClassName=com.mysql.jdbc.jdbc2.optional.MysqlDataSource
spring.datasource.dataSourceProperties.serverName=localhost
spring.datasource.dataSourceProperties.portNumber=3311
spring.datasource.dataSourceProperties.databaseName=mydb
spring.datasource.username=root
spring.datasource.password=root
然后添加
@Bean
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
我在这里创建了一个测试项目:https://github.com/ydemartino/spring-boot-hikaricp
答案 7 :(得分:5)
根据文档进行了更改,
https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-sql.html
示例:
spring:
datasource:
url: 'jdbc:mysql://localhost/db?useSSL=false'
username: root
password: pass
driver: com.mysql.jdbc.Driver
hikari:
minIdle: 10
idle-timeout: 10000
maximumPoolSize: 30
以下是我们在hikari上可以进行的以下配置更改,请根据您的需要进行添加/更新。
autoCommit
connectionTimeout
idleTimeout
maxLifetime
connectionTestQuery
connectionInitSql
validationTimeout
maximumPoolSize
poolName
allowPoolSuspension
readOnly
transactionIsolation
leakDetectionThreshold
答案 8 :(得分:4)
事实证明,除了数据库连接数量之外,几乎所有HikariCP的默认设置都适用于我。我在application.properties中设置了该属性:
spring.datasource.maximumPoolSize=20
就我所知,Andy Wilkinson是正确的,你不能使用Spring引导HikariCP的dataSourceClassName配置方法。
答案 9 :(得分:4)
这是个好消息。 HikariCP是Spring Boot 2.0.0的默认连接池。
Spring Boot 2.0.0 Release Notes
Spring Boot 2.0中的默认数据库池技术已从Tomcat Pool切换到HikariCP。我们发现Hakari提供了卓越的性能,我们的许多用户比Tomcat Pool更喜欢它。
答案 10 :(得分:2)
下面的代码可用于静态数据源初始化。
public class MyDataSource {
private static final String DB_USERNAME="spring.datasource.username";
private static final String DB_PASSWORD="spring.datasource.password";
private static final String DB_URL ="spring.datasource.url";
private static final String DB_DRIVER_CLASS="spring.datasource.driver-class-name";
private static Properties properties = null;
private static HikariDataSource dataSource;
static {
try {
properties = new Properties();
properties.load(new FileInputStream("src/main/resources/application.properties"));
dataSource = new HikariDataSource();
dataSource.setDriverClassName(properties.getProperty(DB_DRIVER_CLASS));
dataSource.setJdbcUrl(properties.getProperty(DB_URL));
dataSource.setUsername(properties.getProperty(DB_USERNAME));
dataSource.setPassword(properties.getProperty(DB_PASSWORD));
dataSource.setMinimumIdle(100);
dataSource.setMaximumPoolSize(2000);
dataSource.setAutoCommit(false);
dataSource.setLoginTimeout(3);
} catch (IOException | SQLException e) {
((Throwable) e).printStackTrace();
}
}
public static DataSource getDataSource(){
return dataSource;
}
public static Connection getConnection() throws SQLException{
return getDataSource().getConnection();
}
}
答案 11 :(得分:2)
现在使用HikcariCp作为默认连接池,使用新版本的spring boot,可以直接如下图。
@Configuration
public class PurchaseOrderDbConfig {
@Bean
@ConfigurationProperties(prefix = "com.sysco.purchaseorder.datasoure")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
}
应用程序.yml
com:
sysco:
purchaseorder:
datasoure:
driverClassName: com.mysql.jdbc.Driver
jdbcUrl: jdbc:mysql://localhost:3306/purchaseorder
username: root
password: root123
idleTimeout: 600000
如果要打印空闲超时值
ApplicationContext context=SpringApplication.run(ApiBluePrint.class, args);
HikariDataSource dataSource=(HikariDataSource) context.getBean(DataSource.class);
System.out.println(dataSource.getIdleTimeout());
如果您不定义任何自定义值,您将获得 600000 的值,其中默认值为 300000
答案 12 :(得分:1)
随着后来的spring-boot版本,切换到Hikari可以完全在配置中完成。我使用1.5.6.RELEASE
并且这种方法有效。
<强>的build.gradle:强>
compile "com.zaxxer:HikariCP:2.7.3"
申请YAML
spring:
datasource:
type: com.zaxxer.hikari.HikariDataSource
hikari:
idleTimeout: 60000
minimumIdle: 2
maximumPoolSize: 20
connectionTimeout: 30000
poolName: MyPoolName
connectionTestQuery: SELECT 1
更改connectionTestQuery
以适合您的基础数据库。这就是它,不需要代码。
答案 13 :(得分:1)
我的设置:
Spring Boot v1.5.10
Hikari v.3.2.x(评估)
要真正了解Hikari数据源的配置,我建议禁用Spring Boot的数据源自动配置。
将以下内容添加到application.properties: -
spring.autoconfigure.exclude = org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
这将禁用Spring Boot自行配置DataSource的功能。
现在您可以定义自己的自定义配置来创建HikariDataSource bean并使用所需的属性填充它。
注意:::
公共类HikariDataSource扩展了HikariConfig
你需要
我相信定义自己的自定义配置类( @Configuration)自己创建数据源并填充 它与在单独的文件中定义的数据源属性(比 传统的:application.properties)
通过这种方式,我可以定义 我自己的sessionFactory Bean使用Hibernate建议: &#34; LocalSessionFactoryBean的&#34;使用您的Hikari数据源进行分类和填充&gt;和其他基于Hiberante-JPA的房产。
基于Spring Boot的Hikari DataSource属性摘要: -
spring.datasource.hikari.allow池悬浮=真
spring.datasource.hikari.auto提交=假
spring.datasource.hikari.catalog =
spring.datasource.hikari.connection-INIT-SQL =
spring.datasource.hikari.connection测试查询=
spring.datasource.hikari.connection超时= 100个
spring.datasource.hikari.data源类名=
spring.datasource.hikari.data源-J-正d-1 =
spring.datasource.hikari.driver类名=
spring.datasource.hikari.idle超时= 50
spring.datasource.hikari.initialization-快速失败=真
spring.datasource.hikari.isolate内部查询=真
spring.datasource.hikari.jdbc-URL =
spring.datasource.hikari.leak检测阈值=
spring.datasource.hikari.login超时= 60个
spring.datasource.hikari.max-寿命=
spring.datasource.hikari.maximum池大小= 500个
spring.datasource.hikari.minimum空闲= 30
spring.datasource.hikari.password =
spring.datasource.hikari.pool名=
spring.datasource.hikari.read只=真
spring.datasource.hikari.register-的mbeans =真
spring.datasource.hikari.transaction隔离=
spring.datasource.hikari.username =
spring.datasource.hikari.validation超时=
答案 14 :(得分:0)
这将帮助想要通过spring自动配置为其应用程序配置hikaricp的任何人。对于我的项目,我使用spring boot 2,将hikaricp作为JDBC连接池,将mysql作为数据库。我在其他答案中没有看到的一件事是data-source-properties
,可用于设置spring.datasource.hikari.*
路径上不可用的各种属性。这等效于使用HikariConfig
类。要为mysql特定的属性配置数据源和hikaricp连接池,我在application.yml文件中使用了spring自动配置注释和以下属性。
将@EnableAutoConfiguration
放在您的一个配置Bean文件中。
application.yml 文件如下所示。
spring:
datasource:
url: 'jdbc:mysql://127.0.0.1:3306/DATABASE?autoReconnect=true&useSSL=false'
username: user_name
password: password
hikari:
maximum-pool-size: 20
data-source-properties:
cachePrepStmts: true
prepStmtCacheSize: 250
prepStmtCacheSqlLimit: 2048
useServerPrepStmts: true
useLocalSessionState: true
rewriteBatchedStatements: true
cacheResultSetMetadata: true
cacheServerConfiguration: true
elideSetAutoCommits: true
maintainTimeStats: false