DataSource Service

주어진 Database에 연결하기 위한 Connection(javax.sql.Connection) 객체를 생성하는 서비스이다. Anyframe Core에서는 Connection Provider별로 Connection 객체를 얻어내기 위한 로직을 구현하고 있는 다음의 DataSource 구현체들을 그대로 사용하고자 한다.

JDBCDataSource Configuration

Description copied from class: DriverManagerDataSource
JDBC driver를 이용하여 Database Connection을 생성한다. 모든 getConnection() call에 대해 새로운 connection을 리턴한다. 실제 운영 환경에서 이 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 string으로 설정되어야 한다.
N
N/A
testOnReturn 객체를 return하기 전에 객체의 유효성을 확인할 것인지 결정한다. true값은 아무 영향을 미치지 않지만 validationQuery property는 non-null string으로 설정되어야 한다.
N
N/A
testWhileIdle idle object evictor가 connection의 유효성을 확인할 것인지를 설정한다. true값은 아무 영향을 미치지 않지만 validationQuery property는 non-null string으로 설정되어야 한다.
N
N/A
validationQuery validationQuery를 설정한다.
N
N/A
loginTimeout Database에 연결하기 위한 login timeout(in seconds)을 설정한다. createDataSource()를 호출 해서 connection 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 Configuration 에서 확인할 수 있다.

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

JNDIDataSource는 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="AnyframeDS"/>
        <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://server.ip: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