Próbuję skonfigurować HikariCP w mojej aplikacji Spring Boot (1.2.0.M1), aby móc przetestować, używając go zamiast Tomcat DBCP. Chciałbym skonfigurować pulę połączeń w moim pliku application.properties, tak jak robiłem to z Tomcat, ale nie wiem, jak mam to zrobić. Wszystkie znalezione przeze mnie przykłady pokazują styl JavaConfig lub osobny plik właściwości HikariCP. Czy ktoś może mi pomóc w ustaleniu nazw właściwości, aby skonfigurować je w application.properties? Chciałbym również przełączyć się z używania podejścia driverClassName na podejście DataSourceClassName, ponieważ wygląda to bardziej przejrzysto i jest zalecane. Czy jest to również możliwe w moich plikach application.properties?
Oto, co miałem dla Tomcat DBCP (tylko podstawowa konfiguracja, nie do końca wypłukana)
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
Obecnie używam driverClassName i jdbc url do skonfigurowania połączenia:
spring.datasource.url=jdbc:mysql://localhost:3306/myDb
spring.datasource.driverClassName=com.mysql.jdbc.Driver
źródło
spring.datasource.hikari.*
dokumentacja: github.com/brettwooldridge/HikariCPOdpowiedzi:
@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
AKTUALIZACJA! Od wersji 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
AKTUALIZACJA! Od wersji Spring Boot 2.0.0 :
Domyślna pula połączeń zmieniła się z Tomcat na Hikari :)
źródło
Natknąłem się
HikariCP
i byłem zdumiony testami porównawczymi i chciałem go wypróbować zamiast mojego domyślnego wyboruC3P0
i ku mojemu zdziwieniu walczyłem, aby uzyskaćconfigurations
właściwą, prawdopodobnie dlatego, że konfiguracje różnią się w zależności od kombinacji stosu technologicznego, którego używasz.Mam
Spring Boot
projekt instalacyjny zeJPA, Web, Security
starterami (przy użyciu Spring Initializer ) do wykorzystaniaPostgreSQL
jako baza danychHikariCP
jako pule połączeń.Użyłem
Gradle
jako narzędzia do budowania i chciałbym podzielić się tym, co zadziałało dla mnie przy następujących założeniach:Potrzebujesz następujących elementów,
build.gradle
jeśli używaszGradle
lub odpowiednika,pom.xml
jeśli używasz 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' } }
W powyższym jest kilka wykluczeń,
build.gradle
a to dlatego, żejdbc-tomcat
podczas pobieraniaspring-boot-starter-data-jpa
zależności wyklucza pulę połączeń . Można to osiągnąć, konfigurującspring.datasource.type=com.zaxxer.hikari.HikariDataSource
również, ale nie chcę dodatkowej zależności, jeśli jej nie potrzebujęhibernate-core
podczas pobierania,com.zaxxer
a to dlatego, żehibernate-core
zostało już pobrane przezSpring Boot
i nie chcemy mieć różnych wersji.hibernate-core
podczas pobieraniahibernate-hikaricp
modułu, który jest potrzebny, aby HikariCP był używanyorg.hibernate.hikaricp.internal.HikariCPConnectionProvider
jako dostawca połączenia, zamiast być przestarzałymcom.zaxxer.hikari.hibernate.HikariConnectionProvider
Kiedy już zorientowałem się,
build.gradle
co zachować, a czego nie, byłem gotowy do skopiowania / wklejeniadatasource
konfiguracji do mojejapplication.properties
i spodziewałem się, że wszystko będzie działać śpiewająco, ale nie do końca i natknąłem się na następujące problemycom.zaxxer.hikari.hibernate.HikariConnectionProvider
key/value
wapplication.properties
i narzekałdataSource, dataSourceClassName, jdbcUrl
. Musiałem przeprowadzić debugowanieHikariConfig, HikariConfigurationUtil, HikariCPConnectionProvider
i okazało się, żeHikariCP
nie mogę znaleźć właściwości,application.properties
ponieważ zostały one nazwane inaczej.W każdym razie w tym miejscu musiałem polegać na próbach i błędach i upewnić się, że
HikariCP
jest w stanie wybrać właściwości (tj. Źródło danych, które jest szczegółami bazy danych, a także właściwościami puli), a także Sping Boot zachowuje się zgodnie z oczekiwaniami i skończyło się na następującyapplication.properties
plik.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
Jak pokazano powyżej, konfiguracje są podzielone na kategorie w oparciu o następujące wzorce nazewnictwa
Trudno znaleźć samouczek, post lub jakiś zasób, który pokazuje, jak używany jest powyższy plik właściwości i jak należy nazywać właściwości. Cóż, masz to.
Rzucanie wyżej
application.properties
zbuild.gradle
(lub przynajmniej podobny) do wersji projektu Wiosna Boot JPA (1.5.8) powinien działać jak czar i połączyć się z bazą danych wstępnie skonfigurowana (czyli w moim przypadku jest to, że zarówno PostgreSQLHikariCP & Spring
postać się odspring.datasource.url
, na którym sterownik bazy danych do użycia).Nie widziałem potrzeby tworzenia
DataSource
fasoli, a to dlatego, że Spring Boot jest w stanie zrobić dla mnie wszystko, po prostu zaglądającapplication.properties
i to jest fajne.Artykuł w GitHub HikariCP za wiki pokazuje sposób konfiguracji wiosennego rozruchu z JPA, ale brakuje wyjaśnień i szczegółów.
Powyższe dwa pliki są również dostępne jako publiczna treść https://gist.github.com/rhamedy/b3cb936061cc03acdfe21358b86a5bc6
źródło
Możesz po prostu użyć tylko pliku application.yml / application.properties. Nie ma potrzeby jawnego tworzenia
DataSource
fasoliMusisz wykluczyć tomcat-jdbc, o czym wspomniał ydemartino
Ponieważ nie utworzysz
DataSource
fasoli, musisz jawnie określić użycie Hikarispring.datasource.type
z wartościącom.zaxxer.hikari.HikariDataSource
w application.yml / application.propertiesspring: 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
W pliku application.yml / application.properties można skonfigurować specyficzne parametry Hikari, takie jak rozmiar puli itp
spring.datasource.hikari.*
źródło
spring.datasource.type
wystarczy dodać .DataSourceBuilder
mówi: Jeśli Tomcat, HikariCP lub fotografia DBCP są na jednej ścieżce klasy z nich zostaną wybrane (w tej kolejności z Tomcat pierwszy). Potwierdzają to moje testy.DataSourceConfiguration
który jest używany w autokonfiguracji, ma konfiguracje zależne od tego,spring.datasource.type
czy w ogóle jest ustawiony. Więc mamtomcat-jdbc
na mojej ścieżce klas i nadal używam HikariCP jako mojej puli. Potwierdzają to moje testy. Może mówimy tutaj o bardzo różnych wersjach Spring Boot.Używam Spring Boot 2.0.4.RELEASE. Hikari to domyślna pula połączeń i
.hikari
nie jest już potrzebna.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
I
configuration
nie trzeba przedłużyćHikariConfig
, iDataSourceBuilder
mogą być używane jak to było wcześniej.@Configuration public class DataSourceConfiguration { @Bean(name="myDataSource") @ConfigurationProperties("spring.datasource") public DataSource myDataSource() { return DataSourceBuilder.create().build(); } }
źródło
Zgodnie z dokumentacją to się zmienia,
https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-sql.html
Przykład:
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
Są to następujące zmiany konfiguracji, które możemy wprowadzić na hikari, dodaj / zaktualizuj zgodnie z potrzebami.
źródło
Nie potrzebujesz dodatkowego kodu do umieszczania wartości właściwości w zmiennych. Właściwości można ustawić bezpośrednio za pomocą pliku właściwości.
Umieść
hikari.properties
plik w ścieżce klas.driverClassName=com.mysql.jdbc.Driver jdbcUrl=jdbc:mysql://localhost:3306/myDb connectionTestQuery=SELECT 1 maximumPoolSize=20 username=... password=...
I stwórz fasolę źródła danych w ten sposób.
@Bean(destroyMethod = "close") public DataSource dataSource() throws SQLException { HikariConfig config = new HikariConfig("/hikari.properties"); HikariDataSource dataSource = new HikariDataSource(config); return dataSource; }
źródło
Działa to w przypadku mojej aplikacji rozruchowej na wypadek, gdyby to pomogło. Ta klasa informuje, jakich właściwości szuka obiekt konfiguracyjny:
https://github.com/brettwooldridge/HikariCP/blob/2.3.x/hikaricp-common/src/main/java/com/zaxxer/hikari/AbstractHikariConfig.java
Myślę, że wiele
datasource_whatever
źródeł danych może być obsługiwanych przez dodanie do kluczy właściwości w źródłowym pliku konfiguracyjnym. Twoje zdrowie!@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 } }
źródło
Możesz użyć podejścia dataSourceClassName, oto przykład z MySQL. (Testowane z butem sprężynowym 1.3 i 1.4)
Najpierw musisz wykluczyć tomcat-jdbc ze ścieżki klas, ponieważ zostanie on wybrany na korzyść 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
Następnie po prostu dodaj
@Bean @ConfigurationProperties(prefix = "spring.datasource") public DataSource dataSource() { return DataSourceBuilder.create().build(); }
Stworzyłem projekt testowy tutaj: https://github.com/ydemartino/spring-boot-hikaricp
źródło
nie można używać podejścia dataSourceClassName w konfiguracjach application.properties, jak powiedział @Andy Wilkinson. jeśli mimo wszystko chcesz mieć dataSourceClassName, możesz użyć Java Config jako:
@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; } }
powód, dla którego nie możesz użyć dataSourceClassName, ponieważ spowoduje zgłoszenie i wyjątek
co oznacza, że rozruch sprężynowy wnioskuje z właściwości spring.datasource.url Driver i jednocześnie ustawienie dataSourceClassName tworzy ten wyjątek. Aby to naprawić, twoja application.properties powinna wyglądać mniej więcej tak dla źródła danych 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
Uwaga: Sprawdź, czy w Twojej ścieżce klas znajduje się jakikolwiek tomcat-jdbc.jar lub commons-dbcp.jar dodawany najczęściej przez zależność przechodnią. Jeśli są one obecne w ścieżce klasy, Spring Boot skonfiguruje źródło danych przy użyciu domyślnej puli połączeń, którą jest tomcat. HikariCP będzie używany tylko do tworzenia źródła danych, jeśli w ścieżce klas nie ma innego dostawcy. istnieje sekwencja awaryjna z tomcat -> do HikariCP -> do Commons DBCP.
źródło
Pomoże to każdemu, kto chce skonfigurować hikaricp do swojej aplikacji z automatyczną konfiguracją wiosny. W moim projekcie używam spring boot 2 z hikaricp jako pulą połączeń JDBC i mysql jako bazą danych. Jedną rzeczą, której nie widziałem w innych odpowiedziach, było to,
data-source-properties
co można wykorzystać do ustawienia różnych właściwości, które nie są dostępne naspring.datasource.hikari.*
ścieżce. Jest to równoważne użyciuHikariConfig
klasy. Aby skonfigurować źródło danych i pulę połączeń hikaricp dla właściwości specyficznych dla mysql, użyłem adnotacji spring auto configure i następujących właściwości w pliku application.yml.Umieść
@EnableAutoConfiguration
na jednym z plików konfiguracyjnych bean.plik application.yml może wyglądać następująco.
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
źródło
Oto dobra wiadomość. HikariCP jest teraz domyślną pulą połączeń w Spring Boot 2.0.0.
Informacje o wydaniu Spring Boot 2.0.0
źródło
Okazuje się więc, że prawie wszystkie ustawienia domyślne dla HikariCP działają u mnie poza liczbą połączeń DB. Ustawiłem tę właściwość w mojej application.properties:
spring.datasource.maximumPoolSize=20
Andy Wilkinson ma rację, o ile mogę powiedzieć, że nie można użyć podejścia konfiguracyjnego dataSourceClassName dla HikariCP ze Spring Boot.
źródło
spring.datasource.maximum-pool-size
gdy używasz właściwości konfiguracji sprężyny, w przeciwnym raziemaximumPoolSize
jest to nazwa parametru HikariCP.My SetUp:
Spring Boot v1.5.10
Hikari v.3.2.x (do oceny)
Aby naprawdę zrozumieć konfigurację źródła danych Hikari, zalecam wyłączenie automatycznej konfiguracji Spring Boot dla źródła danych.
Dodaj do application.properties:
Spowoduje to wyłączenie możliwości Spring Boot do samodzielnego konfigurowania źródła danych.
Teraz masz szansę zdefiniować własną konfigurację niestandardową w celu utworzenia komponentu bean HikariDataSource i wypełnienia go żądanymi właściwościami.
Musisz
Podsumowanie właściwości źródła danych Hikari opartych na rozruchu sprężynowym: -
źródło
W późniejszych wersjach Spring-Boot przejście na Hikari może odbywać się całkowicie w konfiguracji. Używam
1.5.6.RELEASE
i to podejście działa.build.gradle:
compile "com.zaxxer:HikariCP:2.7.3"
aplikacja YAML
spring: datasource: type: com.zaxxer.hikari.HikariDataSource hikari: idleTimeout: 60000 minimumIdle: 2 maximumPoolSize: 20 connectionTimeout: 30000 poolName: MyPoolName connectionTestQuery: SELECT 1
Zmień,
connectionTestQuery
aby dopasować bazową bazę danych. To wszystko, kod nie jest wymagany.źródło
Poniższy kod może służyć do inicjalizacji statycznego źródła danych.
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(); } }
źródło
Miałem problemy, a problemem był biały znak na końcu
spring.datasource.type = com.zaxxer.hikari.HikariDataSource
źródło