Я пытаюсь настроить HikariCP в моем приложении Spring Boot (1.2.0.M1), чтобы я мог протестировать его с помощью вместо 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
источник
spring.datasource.hikari.*
документация: github.com/brettwooldridge/HikariCPОтветы:
@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 :)
источник
Я наткнулся
HikariCP
и был поражен тестами, и я хотел попробовать его вместо своего выбора по умолчанию,C3P0
и, к своему удивлению, я изо всех сил пытался получитьconfigurations
правильное, вероятно, потому что конфигурации различаются в зависимости от того, какую комбинацию технического стека вы используете.У меня есть
Spring Boot
проект установки соJPA, Web, Security
стартерами (с использованием Spring Initializer ) для использованияPostgreSQL
в качестве базы данных сHikariCP
пулом соединений.Я использовал в
Gradle
качестве инструмента сборки и хотел бы поделиться тем, что у меня сработало при следующих предположениях:Вам понадобится следующее,
build.gradle
если вы используетеGradle
или эквивалент,pom.xml
если вы используете mavenbuildscript { 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
зависимостей. Этого можно достичь, установив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
метод проб и ошибок и убедиться, что он может выбирать свойства (т.е. источник данных, который содержит детали базы данных, а также свойства пула), а также 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
(или, по крайней мере, аналогичного) в версию проекта Spring Boot JPA (1.5.8) должно работать как шарм и подключаться к вашей предварительно настроенной базе данных (т.е. в моем случае это PostgreSQL, который обаHikariCP & Spring
выясняют из того,spring.datasource.url
на каком драйвер базы данных для использования).Я не видел необходимости создавать
DataSource
bean-компонент, потому что Spring Boot может делать все за меня, просто заглянув в него,application.properties
и это здорово.В статье на вики-сайте Github HikariCP показано, как настроить Spring Boot с JPA, но отсутствуют объяснения и подробности.
Эти два файла также доступны как общедоступный https://gist.github.com/rhamedy/b3cb936061cc03acdfe21358b86a5bc6
источник
Вы можете просто использовать только application.yml / application.properties. Нет необходимости явно создавать
DataSource
BeanВам нужно исключить tomcat-jdbc, как указано ydemartino
Поскольку вы не будете создавать
DataSource
bean-компонент, вы должны явно указать using Hikari черезspring.datasource.type
значение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
В вашем application.yml / application.properties вы можете настроить конкретные параметры Hikari, такие как размер пула и т. Д. В
spring.datasource.hikari.*
источник
spring.datasource.type
достаточно добавить .DataSourceBuilder
говорится: Если Tomcat, HikariCP или Commons DBCP находятся на пути к классам, один из них будет выбран (в этом порядке сначала с Tomcat). Мои испытания подтверждают это.DataSourceConfiguration
который используется в автоконфигурации, имеет конфигурации в зависимости от того, установленspring.datasource.type
ли он вообще. Итак, у меня естьtomcat-jdbc
путь к классам, и я все еще использую HikariCP в качестве пула. Мои испытания подтверждают это. Возможно, мы говорим здесь о очень разных версиях Spring Boot.Я использую Spring Boot 2.0.4.RELEASE. Hikari - это пул соединений по умолчанию, и
.hikari
в нем больше нет необходимости.application.properties
spring.datasource.driverClassName=com.mysql.jdbc.Driver spring.datasource.jdbcUrl=jdbc:mysql://localhost:3306/myDB... spring.datasource.username=xxx spring.datasource.password=xxx spring.datasource.poolname=myPool
application.yml
spring: datasource: driverClassName: com.mysql.jdbc.Driver jdbcUrl: jdbc:mysql://localhost:3306/myDB... username: xxx password: xxx poolName: myPool
И
configuration
не нужно расширятьHikariConfig
, иDataSourceBuilder
можно использовать, как было раньше.@Configuration public class DataSourceConfiguration { @Bean(name="myDataSource") @ConfigurationProperties("spring.datasource") public DataSource myDataSource() { return DataSourceBuilder.create().build(); } }
источник
Согласно документации он изменен,
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, пожалуйста, добавьте / обновите в соответствии с вашими потребностями.
источник
Вам не нужен избыточный код для помещения значений свойств в переменные. Вы можете установить свойства напрямую в файле свойств.
Поместите
hikari.properties
файл в путь к классам.driverClassName=com.mysql.jdbc.Driver jdbcUrl=jdbc:mysql://localhost:3306/myDb connectionTestQuery=SELECT 1 maximumPoolSize=20 username=... password=...
И сделайте такой компонент источника данных.
@Bean(destroyMethod = "close") public DataSource dataSource() throws SQLException { HikariConfig config = new HikariConfig("/hikari.properties"); HikariDataSource dataSource = new HikariDataSource(config); return dataSource; }
источник
Это работает для моего загрузочного приложения, если это помогает. Этот класс сообщает вам, какие свойства ищет объект конфигурации:
https://github.com/brettwooldridge/HikariCP/blob/2.3.x/hikaricp-common/src/main/java/com/zaxxer/hikari/AbstractHikariConfig.java
Я думаю, что можно поддерживать несколько источников данных, добавляя
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 } }
источник
Вы можете использовать подход dataSourceClassName, вот пример с MySQL. (Проверено с пружинным чехлом 1.3 и 1.4)
Сначала вам нужно исключить tomcat-jdbc из пути к классам, поскольку он будет выбран в пользу hikaricp.
pom.xml
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
источник
вы не можете использовать подход dataSourceClassName в конфигурациях application.properties, как сказал @Andy Wilkinson. если вы все равно хотите иметь 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, потому что он будет вызывать и исключение
что означает, что весенняя загрузка выводится из свойства 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 -> к HikariCP -> к Commons DBCP.
источник
Это поможет всем, кто хочет настроить hikaricp для своего приложения с помощью автоматической настройки Spring. В моем проекте я использую spring boot 2 с hikaricp в качестве пула соединений JDBC и mysql в качестве базы данных. Одна вещь, которую я не видел в других ответах, - это то,
data-source-properties
что можно использовать для установки различных свойств, которые недоступны вspring.datasource.hikari.*
пути. Это эквивалентно использованиюHikariConfig
класса. Чтобы настроить пул соединений с источником данных и hikaricp для конкретных свойств mysql, я использовал аннотацию автоматической настройки Spring и следующие свойства в файле application.yml.Поместите
@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
источник
Вот и хорошие новости. HikariCP теперь является пулом соединений по умолчанию с Spring Boot 2.0.0.
Примечания к выпуску Spring Boot 2.0.0
источник
Получается, что почти все настройки по умолчанию для HikariCP у меня работают, кроме количества подключений к БД. Я установил это свойство в своем application.properties:
spring.datasource.maximumPoolSize=20
И Энди Уилкинсон прав, насколько я могу судить, в том, что вы не можете использовать подход конфигурации dataSourceClassName для HikariCP с Spring Boot.
источник
spring.datasource.maximum-pool-size
когда вы используете свойства конфигурацииmaximumPoolSize
Spring , иначе это имя параметра HikariCP.My SetUp:
Spring Boot v1.5.10
Hikari v.3.2.x (для оценки)
Чтобы действительно понять конфигурацию источника данных Hikari, я рекомендую отключить автоконфигурацию Spring Boot для источника данных.
Добавьте в application.properties следующее: -
Это отключит возможность Spring Boot самостоятельно настраивать DataSource.
Теперь у вас есть возможность определить свою собственную настраиваемую конфигурацию для создания bean-компонента HikariDataSource и наполнить его желаемыми свойствами.
Вам нужно
Сводка свойств источника данных Hikari на основе Spring Boot: -
источник
В более поздних версиях 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
в соответствии с вашей базовой БД. Вот и все, код не требуется.источник
Приведенный ниже код можно использовать для инициализации статического источника данных.
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(); } }
источник
У меня возникли проблемы, и проблема заключалась в пробеле в конце
spring.datasource.type = com.zaxxer.hikari.HikariDataSource
источник