[SPRING] HikariCP 용 Spring을 사용하여 데이터 소스를 설정하는 방법은 무엇입니까?
SPRINGHikariCP 용 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.빈 구조 (이 데이터 소스)에이 구조체를 작성해야한다.
빈 구조 (이 데이터 소스)에이 구조체를 작성해야한다.
<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.내 테스트 자바 구성 (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.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.이 마지막 오류는 SLF4J 라이브러리를 찾을 수 없기 때문에 발생합니다. HikariCP에는 slf4j와 javassist의 두 가지 종속성이 있습니다. BTW, HikariDataSource에는 기본 생성자가 있으며 HikariConfig가 필요하지 않습니다.이 링크를 참조하십시오. 그래서 그것은 결코 문제가되지 않았습니다.
이 마지막 오류는 SLF4J 라이브러리를 찾을 수 없기 때문에 발생합니다. HikariCP에는 slf4j와 javassist의 두 가지 종속성이 있습니다. BTW, HikariDataSource에는 기본 생성자가 있으며 HikariConfig가 필요하지 않습니다.이 링크를 참조하십시오. 그래서 그것은 결코 문제가되지 않았습니다.
-
==============================
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.다음과 같이 서블릿 컨텍스트에서 데이터 소스 빈을 생성 할 수있다.
다음과 같이 서블릿 컨텍스트에서 데이터 소스 빈을 생성 할 수있다.
<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.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.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>
from https://stackoverflow.com/questions/23172643/how-to-set-up-datasource-with-spring-for-hikaricp by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring MVC 3 Controller로부터 만 문자열 메시지를 돌려 준다. (0) | 2018.12.11 |
---|---|
[SPRING] 스프링 MVC 폼 데이터 바인딩을위한 String에서 Custom Object 로의 변환? (0) | 2018.12.11 |
[SPRING] 이것은 Tomcat에서 메모리 누출을 일으킬 가능성이 매우 높습니까? (0) | 2018.12.11 |
[SPRING] @ComponentScan에서 @Component 제외 (0) | 2018.12.11 |
[SPRING] 스프링 보안 및 JSON 인증 (0) | 2018.12.11 |