java - मैं अपने स्प्रिंग बूट ऐप में HikariCP को अपने एप्लिकेशन में कैसे कॉन्फ़िगर करूं?




spring spring-boot (10)

आप @Andy Wilkinson द्वारा कहा गया application.properties कॉन्फ़िगरेशन में dataSourceClassName दृष्टिकोण का उपयोग नहीं कर सकते। यदि आप dataSourceClassName वैसे भी रखना चाहते हैं, तो आप जावा कॉन्फिगरेशन का उपयोग कर सकते हैं:

@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.

जिसका मतलब है कि स्प्रिंग बूट, स्प्रिंग। infasource.url से ड्राइवर की संपत्ति को प्रभावित करता है और साथ ही डेटा सेट सोर्स क्लैमनाम को सेट करता है। इसे सही बनाने के लिए आपके एप्लिकेशन.प्रकार को 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

नोट: कृपया जाँच करें कि क्या आपके क्लासपाथ में कोई टॉमकट-जेडडीबी.जर या कॉमन्स-डीबीसीपी.जर है जो अधिकांश समय सकर्मक निर्भरता द्वारा जोड़ा गया है। यदि ये classpath में मौजूद हैं तो स्प्रिंग बूट डिफ़ॉल्ट कनेक्शन पूल का उपयोग करके डेटासोर्स को कॉन्फ़िगर करेगा जो कि टॉमकैट है। HikariCP का उपयोग केवल Datasource बनाने के लिए किया जाएगा यदि कोई क्लासपैथ में कोई अन्य प्रदाता नहीं है। कम्‍बट से> - HikariCP -> से कॉमन्स DBCP तक फॉलबैक क्रम है।

मैं अपने स्प्रिंग बूट (1.2.0.M1) ऐप में HikariCP स्थापित करने की कोशिश कर रहा हूं ताकि मैं Tomcat DBCP के स्थान पर इसका उपयोग करके परीक्षण कर सकूं। मैं अपने एप्लिकेशन में कनेक्शन पूल को कॉन्फ़िगर करना चाहता हूं। मैं टॉमकैट के साथ ऐसा कर रहा था जैसे मैं कर रहा था, लेकिन मैं यह पता नहीं लगा सकता कि मुझे यह कैसे करना चाहिए। सभी उदाहरण मुझे मिले हैं या तो JavaConfig शैली दिखाते हैं, या एक अलग HikariCP गुण फ़ाइल का उपयोग कर रहे हैं। क्या कोई मुझे प्रॉपर्टी के नामों का पता लगाने में मदद कर सकता है। मैं भी DataSourceClassName दृष्टिकोण के लिए DriverClassName दृष्टिकोण का उपयोग करने से स्विच करना चाहूंगा क्योंकि यह क्लीनर दिखता है और इसकी सिफारिश की जाती है। क्या यह मेरे 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

आप dataSourceClassName दृष्टिकोण का उपयोग कर सकते हैं, यहां MySQL के साथ एक उदाहरण है। (स्प्रिंग बूट 1.3 और 1.4 के साथ परीक्षण किया गया)

पहले आपको क्लासपैथ से टोमकैट-जेडडीबी को बाहर करने की आवश्यकता है क्योंकि इसे हिकारीप के पक्ष में चुना जाएगा।

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


आपको वैरिएबल के लिए संपत्ति मान डालने के लिए अनावश्यक कोड की आवश्यकता नहीं है। आप सीधे गुण फ़ाइल के साथ गुण सेट कर सकते हैं।

hikari.properties में hikari.properties फ़ाइल रखें।

@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
   }
}

और इस तरह एक डेटा स्रोत बीन बनाओ।

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

तो यह पता चला है कि HikariCP के लिए लगभग सभी डिफ़ॉल्ट सेटिंग्स मेरे लिए DB कनेक्शन की संख्या को छोड़कर काम करती हैं। मैंने अपने आवेदन में वह संपत्ति निर्धारित की है।

spring.datasource.maximumPoolSize=20

और एंडी विल्किंसन सही है जहां तक ​​मैं बता सकता हूं कि आप स्प्रिंग बूट के साथ HikariCP के लिए dataSourceClassName कॉन्फ़िगरेशन दृष्टिकोण का उपयोग नहीं कर सकते।


बाद के वसंत-बूट रिलीज के साथ Hikari पर स्विच करना पूरी तरह से कॉन्फ़िगरेशन में किया जा सकता है। मैं 1.5.6.RELEASE का उपयोग कर रहा हूँ। 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

अपने अंतर्निहित DB के अनुरूप connectionTestQuery बदलें। यह है, कोई कोड की आवश्यकता है।


मेरा सेटअप:
स्प्रिंग बूट v1.5.10
हिकारी v.3.2.x (मूल्यांकन के लिए)

हिकारी डेटा स्रोत के कॉन्फ़िगरेशन को समझने के लिए, मैं डेटा स्रोत के लिए स्प्रिंग बूट के ऑटो-कॉन्फ़िगरेशन को अक्षम करने की सलाह देता हूं।

Application.properties के लिए निम्नलिखित जोड़ें:

spring.autoconfigure.exclude = org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration

यह अपने आप ही डेटा स्रोत को कॉन्फ़िगर करने के लिए स्प्रिंग बूट की क्षमता को अक्षम कर देगा।

अब आपके लिए मौका है कि आप HikariDataSource बीन बनाने के लिए अपने स्वयं के कस्टम कॉन्फ़िगरेशन को परिभाषित करें और इसे वांछित गुणों के साथ आबाद करें।

ध्यान दें :::
सार्वजनिक वर्ग HikariDataSource, HikariConfig का विस्तार करता है

आपको

  1. वांछित Hikari गुण का उपयोग करके HikariConfig ऑब्जेक्ट को आबाद करें
  2. HikariDataSource ऑब्जेक्ट को HikariConfig ऑब्जेक्ट के साथ आरम्भ करें, जो कंस्ट्रक्टर के तर्क के रूप में पारित हुआ है।

मैं अपने स्वयं के डेटा स्रोत बनाने के लिए अपने स्वयं के कस्टम कॉन्फ़िगरेशन वर्ग (@Configuration) को परिभाषित करने और एक अलग फ़ाइल में परिभाषित डेटा स्रोत गुणों के साथ इसे पॉप्युलेट करने में विश्वास करता हूं (पारंपरिक से: application.properties)

इस तरीके से मैं हाइबरनेट का उपयोग करके अपने स्वयं के सत्रफैक्शन बीन को परिभाषित कर सकता हूं: "LocalSessionFactoryBean" वर्ग और इसे अपने Hikari Data Source> और अन्य Hiberante-JPA आधारित गुणों के साथ आबाद करें।

वसंत बूट आधारित शिकारी डेटा स्रोत का सारांश: -

spring.datasource.hikari.allow-पूल-निलंबन = true
spring.datasource.hikari.auto-लिखें = false
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 स्रोत-JNDI =
spring.datasource.hikari.driver-वर्ग-नाम =
spring.datasource.hikari.idle-टाइमआउट = 50
spring.datasource.hikari.initialization-असफल फास्ट सच =
spring.datasource.hikari.isolate-आंतरिक-प्रश्नों = true
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 = true
spring.datasource.hikari.transaction-अलगाव =
spring.datasource.hikari.username =
spring.datasource.hikari.validation-टाइमआउट =


मैं स्प्रिंग बूट 2.0.4 का उपयोग कर रहा हूं। कृपया। 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://github.com/brettwooldridge/HikariCP/blob/2.3.x/hikaricp-common/src/main/java/com/zaxxer/hikari/AbstractHikariConfig.java

मुझे लगता है कि मल्टीपल डेटा स्रोत स्रोत फ़ाइल में प्रॉपर्टी कीज़ के लिए datasource_whatever से जोड़कर समर्थन कर सकते हैं। चीयर्स!

autoCommit
connectionTimeout
idleTimeout
maxLifetime
connectionTestQuery
connectionInitSql
validationTimeout
maximumPoolSize
poolName
allowPoolSuspension
readOnly
transactionIsolation
leakDetectionThreshold

यहाँ अच्छी खबर है। HikariCP स्प्रिंग बूट 2.0.0 के साथ अब डिफ़ॉल्ट कनेक्शन पूल है।

स्प्रिंग बूट 2.0.0 नोट्स जारी करें

स्प्रिंग बूट 2.0 में डिफ़ॉल्ट डेटाबेस पूलिंग तकनीक को टॉमकैट पूल से 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

अपडेट किया! संस्करण स्प्रिंग बूट 1.3.0 के बाद से :

  1. बस आश्रितों को HikariCP जोड़ें
  2. अनुप्रयोग कॉन्फ़िगर करें

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

अपडेट किया! संस्करण वसंत बूट 2.0.0 के बाद से :

डिफ़ॉल्ट कनेक्शन पूल Tomcat से Hikari में बदल गया है :)





hikaricp