How to set up datasource with Spring for HikariCP?

后端 未结 9 840
傲寒
傲寒 2020-11-27 02:51

Hi I\'m trying to use HikariCP with Spring for connection pool. I\'m using jdbcTempLate and JdbcdaoSupport.
This is my spring configuration file for datasource:

相关标签:
9条回答
  • 2020-11-27 03:21

    my test java config (for MySql)

    @Bean(destroyMethod = "close")
    public DataSource dataSource(){
        HikariConfig hikariConfig = new HikariConfig();
        hikariConfig.setDriverClassName("com.mysql.jdbc.Driver");
        hikariConfig.setJdbcUrl("jdbc:mysql://localhost:3306/spring-test"); 
        hikariConfig.setUsername("root");
        hikariConfig.setPassword("admin");
    
        hikariConfig.setMaximumPoolSize(5);
        hikariConfig.setConnectionTestQuery("SELECT 1");
        hikariConfig.setPoolName("springHikariCP");
    
        hikariConfig.addDataSourceProperty("dataSource.cachePrepStmts", "true");
        hikariConfig.addDataSourceProperty("dataSource.prepStmtCacheSize", "250");
        hikariConfig.addDataSourceProperty("dataSource.prepStmtCacheSqlLimit", "2048");
        hikariConfig.addDataSourceProperty("dataSource.useServerPrepStmts", "true");
    
        HikariDataSource dataSource = new HikariDataSource(hikariConfig);
    
        return dataSource;
    }
    
    0 讨论(0)
  • 2020-11-27 03:21

    This last error is caused by the library SLF4J not being found. HikariCP has two dependencies: slf4j and javassist. BTW, HikariDataSource does have a default constructor and does not need HikariConfig, see this link. So that was never the problem.

    0 讨论(0)
  • 2020-11-27 03:22

    You can create a datasource bean in servlet context as:

    <beans:bean id="dataSource"
        class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
        <beans:property name="dataSourceClassName"
            value="com.mysql.jdbc.jdbc2.optional.MysqlDataSource" />
        <beans:property name="maximumPoolSize" value="5" />
        <beans:property name="maxLifetime" value="30000" />
        <beans:property name="idleTimeout" value="30000" />
        <beans:property name="dataSourceProperties">
            <beans:props>
                <beans:prop key="url">jdbc:mysql://localhost:3306/exampledb</beans:prop>
                <beans:prop key="user">root</beans:prop>
                <beans:prop key="password"></beans:prop>
                <beans:prop key="prepStmtCacheSize">250</beans:prop>
                <beans:prop key="prepStmtCacheSqlLimit">2048</beans:prop>
                <beans:prop key="cachePrepStmts">true</beans:prop>
                <beans:prop key="useServerPrepStmts">true</beans:prop>
            </beans:props>
        </beans:property>
    </beans:bean>
    
    0 讨论(0)
  • 2020-11-27 03:22

    I have recently migrated from C3P0 to HikariCP in a Spring and Hibernate based project and it was not as easy as I had imagined and here I am sharing my findings.

    For Spring Boot see my answer here

    I have the following setup

    • Spring 4.3.8+
    • Hiberante 4.3.8+
    • Gradle 2.x
    • PostgreSQL 9.5

    Some of the below configs are similar to some of the answers above but, there are differences.

    Gradle stuff

    In order to pull in the right jars, I needed to pull in the following jars

    //latest driver because *brettw* see https://github.com/pgjdbc/pgjdbc/pull/849
    compile 'org.postgresql:postgresql:42.2.0'
    compile('com.zaxxer:HikariCP:2.7.6') {
        //they are pulled in separately elsewhere
        exclude group: 'org.hibernate', module: 'hibernate-core'
    }
    
    // Recommended to use HikariCPConnectionProvider by Hibernate in 4.3.6+    
    compile('org.hibernate:hibernate-hikaricp:4.3.8.Final') {
            //they are pulled in separately elsewhere, to avoid version conflicts
            exclude group: 'org.hibernate', module: 'hibernate-core'
            exclude group: 'com.zaxxer', module: 'HikariCP'
    }
    
    // Needed for HikariCP logging if you use log4j
    compile('org.slf4j:slf4j-simple:1.7.25')  
    compile('org.slf4j:slf4j-log4j12:1.7.25') {
        //log4j pulled in separately, exclude to avoid version conflict
        exclude group: 'log4j', module: 'log4j'
    }
    

    Spring/Hibernate based configs

    In order to get Spring & Hibernate to make use of Hikari Connection pool, you need to define the HikariDataSource and feed it into sessionFactory bean as shown below.

    <!-- HikariCP Database bean -->
    <bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
        <constructor-arg ref="hikariConfig" />
    </bean>
    
    <!-- HikariConfig config that is fed to above dataSource -->
    <bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
            <property name="poolName" value="SpringHikariPool" />
            <property name="dataSourceClassName" value="org.postgresql.ds.PGSimpleDataSource" />
            <property name="maximumPoolSize" value="20" />
            <property name="idleTimeout" value="30000" />
    
            <property name="dataSourceProperties">
                <props>
                    <prop key="serverName">localhost</prop>
                    <prop key="portNumber">5432</prop>
                    <prop key="databaseName">dbname</prop>
                    <prop key="user">dbuser</prop>
                    <prop key="password">dbpassword</prop>
                </props>
            </property>
    </bean>
    
    <bean class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" id="sessionFactory">
            <!-- Your Hikari dataSource below -->
            <property name="dataSource" ref="dataSource"/>
            <!-- your other configs go here -->
            <property name="hibernateProperties">
                <props>
                    <prop key="hibernate.connection.provider_class">org.hibernate.hikaricp.internal.HikariCPConnectionProvider</prop>
                    <!-- Remaining props goes here -->
                </props>
            </property>
     </bean>
    

    Once the above are setup then, you need to add an entry to your log4j or logback and set the level to DEBUG to see Hikari Connection Pool start up.

    Log4j1.2

    <!-- Keep additivity=false to avoid duplicate lines -->
    <logger additivity="false" name="com.zaxxer.hikari">
        <level value="debug"/>
        <!-- Your appenders goes here -->
    </logger>
    

    Logback

    Via application.properties in Spring Boot

    debug=true
    logging.level.com.zaxxer.hikari.HikariConfig=DEBUG 
    

    Using logback.xml

    <logger name="com.zaxxer.hikari" level="DEBUG" additivity="false">
        <appender-ref ref="STDOUT" />
    </logger>
    

    With the above you should be all good to go! Obviously you need to customize the HikariCP pool configs in order to get the performance that it promises.

    0 讨论(0)
  • 2020-11-27 03:29

    I found it in http://www.baeldung.com/hikaricp and it works.

    Your pom.xml

    <dependency>
                <groupId>com.zaxxer</groupId>
                <artifactId>HikariCP</artifactId>
                <version>2.6.3</version>
            </dependency>
    

    Your data.xml

    <bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
        <property name="driverClassName" value="${jdbc.driverClassName}"/>
        <property name="jdbcUrl" value="${jdbc.databaseurl}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>
    <bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
        <constructor-arg ref="hikariConfig" />
    </bean>
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"
          p:dataSource-ref="dataSource"
    />
    

    Your jdbc.properties

    jdbc.driverClassName=org.postgresql.Driver
    jdbc.dialect=org.hibernate.dialect.PostgreSQL94Dialect
    jdbc.databaseurl=jdbc:postgresql://localhost:5432/dev_db
    jdbc.username=dev
    jdbc.password=dev
    
    0 讨论(0)
  • 2020-11-27 03:32

    for DB2, please try below configuration.

    <bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
        <property name="poolName" value="springHikariCP" />
        <property name="dataSourceClassName" value="com.ibm.db2.jcc.DB2SimpleDataSource"/>
    
        <property name="maximumPoolSize" value="${db.maxTotal}" />
        <property name="dataSourceProperties">
            <props>
                <prop key="driverType">4</prop>
                <prop key="serverName">192.168.xxx.xxx</prop>
                <prop key="databaseName">dbname</prop>
                <prop key="portNumber">50000</prop>
                <prop key="user">db2inst1</prop>
                <prop key="password">password</prop>
            </props>
        </property>
    
        <property name="jdbcUrl" value="${db.url}" />
        <property name="username" value="${db.username}" />
        <property name="password" value="${db.password}" />
    </bean>
    <bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
        <constructor-arg ref="hikariConfig" />
    </bean>
    
    0 讨论(0)
提交回复
热议问题