DataSource Service

주어진 Database에 연결하기 위한 Connection(javax.sql.Connection) 객체를 생성하는 서비스이다. Anyframe Core에서는 Connection 객체 Provider별 Connection 객체를 얻기 위한 로직을 abstraction시킨 Spring Framework의 DataSource를 사용하고자 한다.
Spring Framework에서 제공하는 DataSource 구현체는 다음과 같다.

JDBCDataSource Configuration

Description copied from class: DriverManagerDataSourceJDBC driver를 이용하여 Database Connection을 생성한다. 모든 getConnectioncall에 대해 새로운 connection을 리턴한다. production 환경에서 이 JDBCDataSource의 사용은 추천하지 않는다. 이 환경에서는 DBCPDataSource 나, C3P0DataSource이 사용된다.
Property Name
Description
Required
Default Value
url DataBase에 access하기 위한 JDBC URL
Y
N/A
driverClassName JDBC driver class name을 설정한다.
Y
N/A
username DataBase에 access하기 위해 사용된다.
N
N/A
password DataBase에 access하기 위해 사용된다.
N
N/A

Samples

다음은 JDBCDataSource의 속성 설정에 대한 예제이다.
  • Configuration
  • 다음은 JDBCDatasource의 속성을 정의한 applicationContext-datasource.xml의 일부이다. 아래 속성 정의 파일에서는 HSQL DB를 기반으로 하는 dataSource-jdbc Bean을 정의하고 있다.
    <bean id="dataSource-jdbc"    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName"
           value="org.hsqldb.jdbcDriver" />
        <property name="url"
           value="jdbc:hsqldb:file:/./db/sampledb" />
        <property name="username" value="sa" />
    </bean>
  • Test case
  • 예제 코드는 Common Test Case에 포함되어 있다.

DBCPDataSource Configuration

JDBC driver를 이용하여 Database Connection을 생성하는 또다른 구현체이다.Commons DBCP라 불리는 Jakarta의 Database Connection Pool이다. configuration parameter 전체 리스트는 DBCP documentation을 통해 확인 가능하다.
Property Name
Description
Required
Default Value
driverClassName jdbc driver의 class name을 설정한다.
Y
N/A
url DataBase url을 설정한다.
Y
N/A
username DataBase에 접근시 사용할 username을 설정한다.
N
N/A
password DataBase에 접근시 사용할 password를 설정한다.
N
N/A
maxActive 동시에 할당할 수 있는 active connection의 최대 갯수를 설정한다.
N
N/A
maxIdle pool에 남겨놓을 수 있는 idle connection의 최대 갯수를 설정한다.
N
N/A
maxWait 모든 Connection이 사용중일 경우 최대 대기 시간을 설정한다.
N
N/A
defaultAutoCommit 이 datasource로부터 리턴된 connection에 대한 auto-commit 여부를 설정한다.
N
N/A
defaultReadOnly Connection Pool에 의해 생성된 Connection에 read-only 속성을 부여한다.
N
N/A
defaultTransactionIsolation 리턴된 connection에 대한 transaction isolation 속성을 부여한다.
N
N/A
defaultCatalog Connection의 catalog를 설정한다.
N
N/A
minIdle Connection pool의 최소한 idle connection 갯수를 설정한다.
N
N/A
initialSize connection pool에 생성될 초기 connection size를 설정한다.
N
N/A
testOnBorrow Connection pool에서 객체를 가지고 오기 전에 그 객체의 유효성을 확인할 것인지 결정한다. true값은 아무 영향을 미치지 않지만 validationQuery property는 non-null로 설정되어야 한다.
N
N/A
testOnReturn 객체를 return하기 전에 객체의 유효성을 확인할 것인지 결정한다. true값은 아무 영향을 미치지 않지만 validationQuery property는 non-null로 설정되어야 한다.
N
N/A
testWhileIdle idle object evictor가 connection의 유효성을 확인할 것인지를 설정한다. true값은 아무 영향을 미치지 않지만 validationQuery property는 non-null로 설정되어야 한다.
N
N/A
validationQuery validationQuery를 설정한다.
N
N/A
loginTimeout database에 conneting하기 위한 login timeout(in seconds)을 설정한다. createDataSource()를 호출 해서 connetion pool의 초기화를 발생시킨다.
N
N/A

Samples

다음은 DBCPDataSource의 속성 설정에 대한 예제이다.
  • Configuration
  • 다음은 DBCPDatasource의 속성을 정의한 applicationContext-datasource.xml의 일부이다. 아래 속성 정의 파일에서는 HSQL DB를 기반으로 하는 dataSource-dbcp Bean을 정의하고 있다.
    <bean id="dataSource-dbcp" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
        <property name="url" value="jdbc:hsqldb:file:/./db/sampledb"/>
        <property name="username" value="sa"/>
        <property name="maxActive" value="100"/>
        <property name="maxIdle" value="30"/>
        <property name="maxWait" value="1000"/>
        <property name="defaultAutoCommit" value="true"/>
        <property name="removeAbandoned" value="true"/>
        <property name="removeAbandonedTimeout" value="60"/>
        <property name="logAbandoned" value="true"/>
    </bean>
  • Test case
  • 예제 코드는 Common Test Case에 포함되어 있다.

C3P0DataSource Configuration

JDBC driver를 이용하여 Database Connection을 생성하는 또다른 구현체이다. C3P0 Library에 관한 자세한 사항을 C3P0 Configration에서 확인할 수 있다.

Samples

다음은 C3P0DataSource의 속성 설정에 대한 예제이다.
  • Configuration
  • 다음은 C3P0Datasource의 속성을 정의한
    applicationContext-datasource.xml의 일부이다. 아래 속성 정의 파일에서는 HSQL DB를 기반으로 하는 dataSource-c3p0 Bean을 정의하고 있다.
    <bean id="dataSource-c3p0" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
        <property name="driverClass" value="org.hsqldb.jdbcDriver"/>
        <property name="jdbcUrl" value="jdbc:hsqldb:file:/./db/sampledb"/>
        <property name="user" value="sa"/>
        <property name="minPoolSize" value="5"/>
        <property name="acquireIncrement" value="5"/>
        <property name="maxPoolSize" value="15"/>
    </bean>
  • Test case
  • 예제 코드는 Common Test Case에 포함되어 있다.

JNDIDataSource Configuration

JNDI Lookup을 이용하여 Database Connection을 생성한다. JNDIDataSource는 대부분 Enterprise application server에서 제공되는 JNDI tree로 부터 DataSource를 가져온다. Description copied from class: JndiObjectFactoryBean JNDIDataSource는 일반적으로 application context의 singleton factory(e.g. JNDI-bound DataSource)를 등록하여 사용할 수 있고, 필요한 application service를 빈으로 참조할 수 있다.
기본적으로 startup시 캐싱된 JNDI 객체를 검색한다. 이것은 "lookupOnStartup"과 "cache" property를 통해 customized 할 수 있으며, JndiObjectTargetSource를 사용할 수 있다. 실제 JNDI object type 미리 정의되 있지 않은 경우 proxyInterface의 정의가 필요하다.
Property Name
Description
Required
Default Value
jndiTemplate JNDI 검색을 위해 JNDI 템플릿을 설정한다. 또한 "jndiEnvironment"로 JNDI 환경 설정을 할 수 있다.
N
N/A
jndiEnvironment JNDI를 검색하기 위해 JNDI 환경을 설정한다. 환경 설정에 제공된 JndiTemplate을 생성한다.
N
N/A
resourceRef J2EE 컨테이너에서 검색할 수 있는지 설정한다. 만약 prefix가 "java:comp/env/"이면 JNDI 이름이 포함되있지 않으므로 추가해 주어야 한다. 디폴트 값은 "false"이다. 주의 : 만약 "java:" 와 같이 주어진 scheme이 아니라면 적용할 수 없다.
N
false
expectedType JNDI 객체의 타입을 지정한다.
N
N/A
jndiName 검색을 위해 JNDI 이름을 설정한다. 만약 resourceRef가 true로 설정되어 있고, "java:comp/env/"로 시작되지 않으면 이 prefix를 추가한다.
Y
N/A
proxyInterface JNDI 객체를 사용하기 위해 proxy 인터페이스를 설정한다. 일반적으로 lookupOnStartup=false와 cache=false와 함께 쓰인다. lazy lookup인 경우 실제 JNDI 객체 타입을 미리 알 수 없기 때문에 이러한 설정이 필요하다.
N
N/A
lookupOnStartup starup시에 JNDI object를 검색할지 설정한다. lazy lookup시에는 proxy interface 정의가 필요하다.
N
true
cache JNDI 객체를 캐싱할 것인지 설정한다.
N
true
defaultObject JNDI lookup에 실패하였을 경우 전달할 default object를 지정한다. 이것은 임의의 bean reference나 literal value가 될 수 있다. 주의 : 이것은 startup시 lookup에서만 지원된다.
N
none

Samples

다음은 JNDIDataSource의 속성 설정에 대한 예제이다. jnditemplate Bean에 JNDI Server에 대한 속성을 정의하고, dataSource Bean에서 jnditemplate Bean을 참조하여 Connection 객체를 얻어낼 수 있도록 하고 있다.
  • Configuration
  • <bean class="org.springframework.jndi.JndiObjectFactoryBean" id="dataSource">    <property name="jndiName" value="STMRDS"/>
        <property name="jndiTemplate" ref="jnditemplate"/></bean>
    <bean class="org.springframework.jndi.JndiTemplate" id="jnditemplate">    <property name="environment">
           <props>
              <prop key="java.naming.factory.initial">
                   weblogic.jndi.WLInitialContextFactory
              </prop>
              <prop key="java.naming.provider.url">
                   t3://107.108.150.108:7001
              </prop>			
           </props>
        </property>
    </bean>
  • Test case
  • 예제 코드는 Common Test Case에 포함되어 있다.

Test Case

다음은 앞서 정의한 속성 설정 파일들을 기반으로 하여 Datasource를 connection 하는 DatasourceServiceTest.java 코드의 일부이다.
/**
 * 각각의 DataSourceService를 통해 Connection 객체를 구하는 테스트 
 */
public void testGetConnection(String beanId)throws Exception {
    // 1. 각각의 beanId(dataSource-dbcp, dataSource-c3p0, dataSource-jdbc)에 대한 
    // DataSource 객체를 생성한다.
    DataSource datasource = (DataSource) context.getBean(beanId);
    // 2. 생성된 DataSource로 부터 connection을 얻는다.
    Connection conn = datasource.getConnection();    if (conn==null)
       throw new Exception("fail to get Connection.");
}

Resources