CORE
HOME > JAVA > J2SE > CORE
2016.11.03 / 10:12

BoneCP (Java database connection pool ) 설정 및 사용

기리아빠
추천 수 70

 

Bonecp는 dbcp, c3p0 를 대체하는 고성능의 Java database connection pool 구현물.

 

사용조건

  1. JDK 1.5 이상
  2. Google Guava library 필요
  3. SLF4J logging library 필요

 

설정 값 및 성능 자료

설정값

  1. partitionCount : Pool 에서 connection 을 가져올때 lock 경쟁을 최소화하기 위해 pool 을 여러 개 파티션으로 나눌수 있음. 기본값은 1이며 높은 성능이 필요할 때 3~4 정도 추천
  2. maxConnectionsPerPartition: 파티션별 Connection 수. 전체 Connection 은 partitionCount * maxConnectionsPerPartion 이 됨.(3개 파티션이 있고 maxConnectionsPerPartion 이 5면 전체 DB Connection 은 15가 됨)
  3. acquireIncrement: 파티션내 Connection 이 모두 소모되었을때 늘릴 Connection Count. 기본값은 10 이며 전체 Count가 아니라 파티션별 count임

 

성능 비교

WAS의 JNDI 로 사용

TOMCAT 설정

JNDI 로 사용시 WAS 구동시 BoneCP가 의존하는 library 를 찾기때문에 WAS의 lib 폴더에 의존성있는 library 를 넣어야 deploy 문제 없음

  • releaseHelperThreads 는 deprecated 이다.
  • IdleMaxAge 대신 idleMaxAgeInMinutes 를 써야 한다.
  • idleConnectionTestPeriod 대신 idleConnectionTestPeriodInMinutes 를 써야 한다.

https://github.com/wwadge/bonecp/blob/master/bonecp/src/main/resources/bonecp-default-config.xml

<Resource name="jdbc/spring-demo"  auth="Container"
   driverClass="com.mysql.jdbc.Driver"
   username="springdemo"
   password="demo1234"
   idleConnectionTestPeriodInMinutes="60"
   idleMaxAgeInMinutes="60"
   maxConnectionsPerPartition="30"
   minConnectionsPerPartition="5"
   partitionCount="3"
   acquireIncrement="5"  
   statementsCacheSize="100"
   factory="org.apache.naming.factory.BeanFactory"
   type="com.jolbox.bonecp.BoneCPDataSource"
   jdbcUrl="jdbc:mysql://localhost:3306/springdemo?autoReconnect=true&amp;useUnicode=true&amp;characterEncoding=utf8"
/>

tomcat의 경우 Context.xml 에 ResourceLink를 추가해 줘야 한다.

<Context>
   <ResourceLink name="jdbc/spring-demo" global="jdbc/spring-demo" type="javax.sql.DataSource"/>
</Context>

Spring의 AppContext

<?xml version="1.0" encoding="UTF-8"?>
        xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/tx
            http://www.springframework.org/schema/tx/spring-tx.xsd
            http://www.springframework.org/schema/jee
            http://www.springframework.org/schema/jee/spring-jee.xsd">
     
    <jee:jndi-lookup id="jdbc/spring-demo"   jndi-name="jdbc/spring-demo" expected-type="javax.sql.DataSource" />
     
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"
        p:dataSource-ref="jdbc/spring-demo"
        p:mapperLocations="classpath:/mycom/mypkg/mapper/*mapper.xml"
        p:configLocation="classpath:/mycom/mypkg/mybatis-config.xml"
        />
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"
        p:basePackage="mycom.mypkg.mapper" />
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
        p:dataSource-ref="jdbc/spring-demo" />  
    
</beans>

 

Spring 의 appContext에서 사용

Application Context 에 다음 내용 추가

<?xml version="1.0" encoding="UTF-8"?>
  
<!-- BoneCP configuration -->
<bean id="mainDataSource" class="com.jolbox.bonecp.BoneCPDataSource" destroy-method="close">
   <property name="driverClass" value="com.mysql.jdbc.Driver" />
   <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/springdemo?autoReconnect=true&amp;useUnicode=true&amp;characterEncoding=utf8" />
   <property name="username" value="springdemo"/>
   <property name="password" value="demo1234"/>
   <property name="idleConnectionTestPeriod" value="60"/>
   <property name="idleMaxAge" value="240"/>
   <property name="maxConnectionsPerPartition" value="30"/>
   <property name="minConnectionsPerPartition" value="10"/>
   <property name="partitionCount" value="3"/>
   <property name="acquireIncrement" value="5"/>
   <property name="statementsCacheSize" value="100"/>
   <property name="releaseHelperThreads" value="3"/>
</bean>
  
   <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"
        p:dataSource-ref="mainDataSource" p:mapperLocations="classpath:/mycompany/mypkg/mapper/*mapper.xml"
        p:configLocation="classpath:/mycompany/mypkg/mybatis-config.xml" />
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"
        p:basePackage="mycompany.mypkg.mapper" />
  
    <bean id="transactionManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
        p:dataSource-ref="mainDataSource" />
</beans>

 

maven pom.xml 에 추가

<dependencies>
 <dependency>   
        <groupId>com.jolbox</groupId>
        <artifactId>bonecp</artifactId>
        <version>0.8.0.RELEASE</version>
    </dependency>   
</dependencies>
<repositories>
        <repository>
          <releases>
                <enabled>true</enabled>
            </releases>
            <id>bonecp-repo</id>
            <name>BoneCP Repository</name>
            <url>http://jolbox.com/bonecp/downloads/maven</url>
        </repository>
    </repositories>

log4j 설정

log4j.category.com.jolbox=DEBUG,Console

 

See Also

 

Ref