[펌]iBATIS 2.3.0 또는 2.3.2 이상 sqlmap 자동 리로딩

개요
iBATIS + Spring 개발시 쿼리 매핑 파일이 변경되면 웹애플리케이션 서버를 재기동해야 적용이 됐었다. 이러한 불편을 없애기 위해 매핑 파일 변경을 실시간으로 감시, 적용하는 모듈을 제공한다.
감시 대상 이 모듈은 iBATIS sqlmap 클라이언트의 sqlMap 및 sqlMapConfig 파일의 변경을 감지, 실시간 적용해준다.

제약사항
감시 대상 파일들은 스타트업 당시에 결정된다. 그러므로 추가된 파일들에 대해서는 감지가 되지 않고, 삭제된 파일들에 대해서는 경고 메시지가 나온다. 예를 들어, sqlMapConfig에 sqlMap 파일이 추가되거나 하면 해당 맵이 적용되기는 하지만, 실시간 변경 감지 대상으로 추가되지는 않는다.

 

요구사항
iBATIS sqlmap 2.3.0, Java 1.4, Spring 2.5 이상 또는 iBATIS sqlmap 2.3.2 이상,
Java 1.5 이상, Spring 2.5.5 이상

 

적용 순서
1. Spring의 applicationContext 설정 파일 중 sqlMapClient를 얻기 위한 SqlMapClientFactory 빈을 신규 클래스로 교체한다. 
2. 변경 감지 시간 간격 (1000분의 1초 단위)를 지정한다.

3. 라이브러리 추가 
backport-util-concurrent-3.1.jar -> 첨부파일참조

 

[ applicationContext.xml ]

<?xml version=”1.0″ encoding=”UTF-8″?>

<!DOCTYPE beans PUBLIC
“-//SPRING//DTD BEAN//EN”
http://www.springframework.org/dtd/spring-beans.dtd“>

<beans default-autowire=”no” default-lazy-init=”false”
default-dependency-check=”none”>
<!– JNDI DataSource for J2EE environments –>
<bean id=”dataSource”
  class=”com.emaintec.common.db.JndiObjectFactoryBeanUtil”>
<property name=”jndiName”>
<value>com.emaintec.datasource</value>
</property>
</bean>
<!– Transaction manager for a single JDBC DataSource (alternative to JTA) –>
<bean id=”transactionManager”
class=”org.springframework.jdbc.datasource.DataSourceTransactionManager”>
<property name=”dataSource”>
<ref local=”dataSource” />
</property>
</bean>
<bean id=”defaultTransactionProxy” class=”org.springframework.transaction.interceptor.TransactionProxyFactoryBean”
abstract=”true”>
<property name=”transactionManager” ref=”transactionManager”/>
<property name=”transactionAttributes”>
<props>
<prop key=”*”>
PROPAGATION_REQUIRED,
-java.lang.Exception
</prop>
</props>
</property>
</bean>

<!–  변경전 
<bean id=”sqlMapClient” class=”org.springframework.orm.ibatis.SqlMapClientFactoryBean”> 
<property name=”dataSource” ref=”dataSource” />
<property name=”configLocation” value=”WEB-INF/config/sql_map_config.xml” />
</bean>
–>

 

<!– 

       변경후 :

1. SqlMapClientFactoryBean 를 변경하여 파일변경시 다시 xml 로딩하도록 한다.

2. mappingLocations 을 사용하여 패턴을 주어 여러 파일을 한번에 지정 가능하다

3. checkInterval : 1000/1 초에 한번식 파일변경 체크를 함

–>
<bean id=”sqlMapClient” class=”com.emaintec.common.ibatis.RefreshableSqlMapClientFactoryBean”> 
<property name=”dataSource” ref=”dataSource” />
 <property name=”mappingLocations” value=”classpath:com/emaintec/common/ibatis/sqlmap/**/*.xml” /> 
<property name=”configLocation” value=”WEB-INF/config/sql_map_config.xml” />
<property name=”checkInterval” value=”1000″ /> 
</bean>
</beans>

 

 

[ sql_map_config.xml ]

<?xml version=”1.0″ encoding=”EUC-KR”?>
<!DOCTYPE sqlMapConfig PUBLIC “-//iBATIS.com//DTD SQL Map Config 2.0//EN”
http://www.ibatis.com/dtd/sql-map-config-2.dtd“>

<sqlMapConfig>
<settings
cacheModelsEnabled=”true”
enhancementEnabled=”true”
lazyLoadingEnabled=”true”
maxRequests=”40″
maxSessions=”20″
maxTransactions=”5″
useStatementNamespaces=”true”
defaultStatementTimeout=”5″
statementCachingEnabled=”true”
classInfoCacheEnabled=”true”
/>

<!– dtd 상 하나는 지정해 주어야 하므로 dummy xml 을 만들어 넣어준다.–>

<sqlMap resource=”../classes/com/emaintec/common/ibatis/sqlmap/testcase-dummy.xml”/>
</sqlMapConfig>

 

[ testcase-dummy.xml ]

<?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE sqlMap PUBLIC “-//iBATIS.com//DTD SQL Map 2.0//EN” “http://www.ibatis.com/dtd/sql-map-2.dtd“>
<sqlMap namespace=”Dummy”/>

 

 

[ Java file : 첨부파일 참조 ]

RefreshableSqlMapClientFactoryBean.java

SqlMapClientRefreshable.java

SqlMapExtractingSqlMapConfigParser.java