복붙노트

[SPRING] HikariCP 용 Spring을 사용하여 데이터 소스를 설정하는 방법은 무엇입니까?

SPRING

HikariCP 용 Spring을 사용하여 데이터 소스를 설정하는 방법은 무엇입니까?

안녕하세요, 연결 풀에 HikariCP를 사용하려고합니다. 나는 jdbcTempLate와 JdbcdaoSupport를 사용하고있다. 이것은 데이터 소스를위한 나의 스프링 설정 파일이다 :

<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource">
    <property name="dataSourceClassName" value="oracle.jdbc.driver.OracleDriver"/>
    <property name="dataSource.url" value="jdbc:oracle:thin:@localhost:1521:XE"/>
    <property name="dataSource.user" value="username"/>
    <property name="dataSource.password" value="password"/>
</bean>

그러나 유감스럽게도 다음과 같은 오류 메시지가 생성됩니다.

Cannot resolve reference to bean 'dataSource' while setting bean property 'dataSource'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in ServletContext resource [/WEB-INF/dispatcher-servlet.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.zaxxer.hikari.HikariDataSource]: No default constructor found; nested exception is java.lang.NoSuchMethodException: com.zaxxer.hikari.HikariDataSource.<init>()

아무도이 문제를 해결하는 방법을 말해 줄래?

해결법

  1. ==============================

    1.빈 구조 (이 데이터 소스)에이 구조체를 작성해야한다.

    빈 구조 (이 데이터 소스)에이 구조체를 작성해야한다.

    <bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
        <property name="poolName" value="springHikariCP" />
        <property name="connectionTestQuery" value="SELECT 1" />
        <property name="dataSourceClassName" value="${hibernate.dataSourceClassName}" />
        <property name="maximumPoolSize" value="${hibernate.hikari.maximumPoolSize}" />
        <property name="idleTimeout" value="${hibernate.hikari.idleTimeout}" />
    
        <property name="dataSourceProperties">
            <props>
                <prop key="url">${dataSource.url}</prop>
                <prop key="user">${dataSource.username}</prop>
                <prop key="password">${dataSource.password}</prop>
            </props>
        </property>
    </bean>
    
    <!-- HikariCP configuration -->
    <bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
        <constructor-arg ref="hikariConfig" />
    </bean>
    

    이것은 나의 모범이며 그것이 효과가있다. 당신은 hibernate.properties에 당신의 프로퍼티를 넣고 그것을 설정해야한다.

    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath:hibernate.properties</value>
            </list>
        </property>
    </bean>
    

    Obs : 버전은     log4j : 1.2.16     springframework : 3.1.4. 릴리스     히카리 CP : 1.4.0

    특성 파일 (hibernate.properties) :

    hibernate.dataSourceClassName=oracle.jdbc.pool.OracleDataSource
    hibernate.hikari.maximumPoolSize=10
    hibernate.hikari.idleTimeout=30000
    dataSource.url=jdbc:oracle:thin:@localhost:1521:xe
    dataSource.username=admin
    dataSource.password=
    
  2. ==============================

    2.내 테스트 자바 구성 (MySql 용)

    내 테스트 자바 구성 (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;
    }
    
  3. ==============================

    3.XML 구성을 사용하면 데이터 소스가 다음과 같이 보일 것입니다.

    XML 구성을 사용하면 데이터 소스가 다음과 같이 보일 것입니다.

        <bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">  
          <property name="dataSourceProperties" >
            <props>
                <prop key="dataSource.url">jdbc:oracle:thin:@localhost:1521:XE</prop>
                <prop key="dataSource.user">username</prop>
                <prop key="dataSource.password">password</prop>
            </props>
          </property>  
          <property name="dataSourceClassName"   
                    value="oracle.jdbc.driver.OracleDriver" />  
        </bean>  
    
        <bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource">  
              <constructor-arg ref="hikariConfig" />  
        </bean>  
    

    또는 HikariConfig 빈을 건너 뛰고 여기에 언급 된 것과 같은 접근법을 사용할 수 있습니다.

  4. ==============================

    4.이 마지막 오류는 SLF4J 라이브러리를 찾을 수 없기 때문에 발생합니다. HikariCP에는 slf4j와 javassist의 두 가지 종속성이 있습니다. BTW, HikariDataSource에는 기본 생성자가 있으며 HikariConfig가 필요하지 않습니다.이 링크를 참조하십시오. 그래서 그것은 결코 문제가되지 않았습니다.

    이 마지막 오류는 SLF4J 라이브러리를 찾을 수 없기 때문에 발생합니다. HikariCP에는 slf4j와 javassist의 두 가지 종속성이 있습니다. BTW, HikariDataSource에는 기본 생성자가 있으며 HikariConfig가 필요하지 않습니다.이 링크를 참조하십시오. 그래서 그것은 결코 문제가되지 않았습니다.

  5. ==============================

    5.나는 최근에 Spring과 Hibernate 기반 프로젝트에서 C3P0에서 HikariCP로 마이그레이션했으며 생각했던 것만 큼 쉽지는 않았지만 여기서 나의 발견을 공유하고있다.

    나는 최근에 Spring과 Hibernate 기반 프로젝트에서 C3P0에서 HikariCP로 마이그레이션했으며 생각했던 것만 큼 쉽지는 않았지만 여기서 나의 발견을 공유하고있다.

    스프링 부트에 대한 나의 대답은 여기를 참조하십시오.

    다음 설정이 있습니다.

    아래 설정 중 일부는 위의 답변 중 일부와 유사하지만 차이점이 있습니다.

    오른쪽 항아리를 잡아 당기기 위해서, 나는 다음 항아리를 꺼내야했다.

    //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가 히카리 연결 풀을 사용하게하려면 HikariDataSource를 정의하고 sessionFactory 빈으로 아래 그림과 같이 입력해야합니다.

    <!-- 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>
    

    위의 설정이 끝나면 log4j 또는 logback에 항목을 추가하고 레벨을 DEBUG로 설정하여 히카리 연결 풀을 시작해야합니다.

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

    Spring 부트의 application.properties를 통해

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

    logback.xml 사용

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

    위와 함께 가면 모두 좋을 것입니다! 분명히 약속 한 성능을 얻으려면 HikariCP 풀 구성을 사용자 정의해야합니다.

  6. ==============================

    6.다음과 같이 서블릿 컨텍스트에서 데이터 소스 빈을 생성 할 수있다.

    다음과 같이 서블릿 컨텍스트에서 데이터 소스 빈을 생성 할 수있다.

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

    7.http://www.baeldung.com/hikaricp에서 찾았습니다.

    http://www.baeldung.com/hikaricp에서 찾았습니다.

    당신의 pom.xml

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

    귀하의 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"
    />
    

    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
    
  8. ==============================

    8.DB2의 경우 다음 구성을 시도하십시오.

    DB2의 경우 다음 구성을 시도하십시오.

    <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>
    
  9. from https://stackoverflow.com/questions/23172643/how-to-set-up-datasource-with-spring-for-hikaricp by cc-by-sa and MIT license