2009년 04월 14일
Altibase에서 LOB 사용하기. Part 2.
이번에는 iBatis를 사용하는 경우 LOB 사용방법이다.
먼저 Altibase의 설정에서 AUTO_COMMIT이 1로 되어 있는지 확인한다.
먼저 Altibase의 설정에서 AUTO_COMMIT이 0으로 되어 있는지 확인한다. 1은 TRUE, 0은 FALSE이다. 0으로 해서 AUTO_COMMIT을 False로 만든다.
config 파일의 위치는 $ALTIBASE_HOME/conf에 있으며 altibase.properties이다. 대략 230라인쯤이다.
iBatis의 SqlMap XML 파일에서 사용하는 resultMap의 Column은 다음과 같이 이용하면 된다.
<resultmap id="someResult" class="test.hops.SomeResult">
<result property="id" column="ID" columnindex="1"/>
<result property="blob" column="PHOTO" columnindex="2" jdbcType="BLOB"/>
</resultmap>
쿼리는 일반 SELECT 및 INSERT 쿼리와 동일하게 사용하면 된다.
SELECT 쿼리는 일반 쿼리와 동일하게 사용하면 되고, INSERT는 다음과 같이 사용한다.
insert into som_tbl(id, photo) values (#id#, #blob:BLOB#)
즉, property명:BLOB으로 jdbcType을 주면 된다.
test.hops.SomeResult 클래스에서 BLOB 값을 담을 property는 byte[]로 사용하면 된다.
public class SomeResult {
private byte[] blob;
public void setBlob(byte[] blob) ...
public byte[] getBlob() ...
}
뭔가 내용이 빠졌다. 다시금 해 보니.. 에러가.. 헐...
그리고 Spring Transaction 처리를 해 주면 끝난다. 당연 아는 얘기겠지만,
applicationContext.xml에서 다음을 추가한다.
<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"/>
<bean id="txProxyTemplate" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref local="transactionManager"></ref>
</property>
<property name="transactionAttributes">
<props>
<prop key="*">PROPAGATION_REQUIRED, -Exception</prop>
</props>
</property>
</bean>
그런 후에 Spring Bean(보통 서비스 빈)이 Transaction이 되도록 설정해 준다.
<bean id="service" parent="txProxyTemplate">
<property name="target">
<bean class="some.package.SomeServiceImpl">
...
한가지, 고려하고 풀어나갈 문제는 BLOB이나 CLOB의 데이터가 큰 경우 해당 데이터를 메모리로 가지고 있게 된다.
퍼포먼스나 효율적인 메모리 사용을 고려해 볼 때 문제가 된다. iBatis에서 InputStream을 통해서 가지고 올 수 있는 방법이나, 아니면 ResultMap을 짧게 사용하는 방법 등을 생각해 봐야겠다.

이 저작물은 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 2.0 대한민국 라이선스에 따라 이용할 수 있습니다.
먼저 Altibase의 설정에서 AUTO_COMMIT이 1로 되어 있는지 확인한다.
먼저 Altibase의 설정에서 AUTO_COMMIT이 0으로 되어 있는지 확인한다. 1은 TRUE, 0은 FALSE이다. 0으로 해서 AUTO_COMMIT을 False로 만든다.
config 파일의 위치는 $ALTIBASE_HOME/conf에 있으며 altibase.properties이다. 대략 230라인쯤이다.
iBatis의 SqlMap XML 파일에서 사용하는 resultMap의 Column은 다음과 같이 이용하면 된다.
<resultmap id="someResult" class="test.hops.SomeResult">
<result property="id" column="ID" columnindex="1"/>
<result property="blob" column="PHOTO" columnindex="2" jdbcType="BLOB"/>
</resultmap>
쿼리는 일반 SELECT 및 INSERT 쿼리와 동일하게 사용하면 된다.
SELECT 쿼리는 일반 쿼리와 동일하게 사용하면 되고, INSERT는 다음과 같이 사용한다.
insert into som_tbl(id, photo) values (#id#, #blob:BLOB#)
즉, property명:BLOB으로 jdbcType을 주면 된다.
test.hops.SomeResult 클래스에서 BLOB 값을 담을 property는 byte[]로 사용하면 된다.
public class SomeResult {
private byte[] blob;
public void setBlob(byte[] blob) ...
public byte[] getBlob() ...
}
뭔가 내용이 빠졌다. 다시금 해 보니.. 에러가.. 헐...
그리고 Spring Transaction 처리를 해 주면 끝난다. 당연 아는 얘기겠지만,
applicationContext.xml에서 다음을 추가한다.
<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"/>
<bean id="txProxyTemplate" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref local="transactionManager"></ref>
</property>
<property name="transactionAttributes">
<props>
<prop key="*">PROPAGATION_REQUIRED, -Exception</prop>
</props>
</property>
</bean>
그런 후에 Spring Bean(보통 서비스 빈)이 Transaction이 되도록 설정해 준다.
<bean id="service" parent="txProxyTemplate">
<property name="target">
<bean class="some.package.SomeServiceImpl">
...
한가지, 고려하고 풀어나갈 문제는 BLOB이나 CLOB의 데이터가 큰 경우 해당 데이터를 메모리로 가지고 있게 된다.
퍼포먼스나 효율적인 메모리 사용을 고려해 볼 때 문제가 된다. iBatis에서 InputStream을 통해서 가지고 올 수 있는 방법이나, 아니면 ResultMap을 짧게 사용하는 방법 등을 생각해 봐야겠다.

이 저작물은 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 2.0 대한민국 라이선스에 따라 이용할 수 있습니다.
# by | 2009/04/14 17:41 | 작업일지 | 트랙백 | 덧글(0)





☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]