본문 바로가기
개발을하자/SQL

#Lob type# CLOB/BLOB 타입을 알고가자!

by _ssu 2015. 10. 30.

Lob type이란?

lob(Large Object) 타입은 대용량 데이터를 저장하기위한 데이터 타입으로 오라클 8버전부터 지원된다.

 

Lob 타입의 특징

이전에 대용량 처리는 long 타입으로 처리를 할 수 밖에 없었다. 그런데 이 칼럼은 한테이블에 하나만 사용할 수 있으며 최대 크기가 2GB였다. 더군다나 검색을 구현하기가 어려워 포기를 해야 했다. 그래서 이런 문제를 보안하기 위 나온 것이 Lob 타입이다. Lob 타입은 테이블에 여러개의 컬럼을 생성할 수 있으며 최대 크기가 4GB이다. 또한 long 타입보다 훨씬 쉬운 검색기능을 제공한다.

 

Lob type의 종류

이전에 대용량 처리는 long 타입으로 처리를 할 수 밖에 없었다. 그런데 이 칼럼은 한테이블에 하나만 사용할 수 있으며 최대 크기가 2GB였다. 더군다나 검색을 구현하기가 어려워 포기를 해야 했다. 그래서 이런 문제를 보안하기 위 나온 것이 Lob 타입이다. Lob 타입은 테이블에 여러개의 컬럼을 생성할 수 있으며 최대 크기가 4GB이다. 또한 long 타입보다 훨씬 쉬운 검색기능을 제공한다.

BLob(Binary Large Object), 이진 바이너리 데이터의 저장시 사용된다.
CLob(Character Large Object), 문서 데이터의 저장시 사용된다.
BFILE외부 파일에 저장된 이진 데이터가 있는 경로의 저장시 사용된다.

 

Clob에 저장하기

1: import java.sql.*;
  2: import java.io.*;
  3: import oracle.sql.*;
  4: import oracle.jdbc.driver.*;
  5: ...
  6: 
  7: public void insertQuery(UploadBoard up,int re_step,int re_level) 
         throws Exception  
  8: {
  9:   ResultSet rs   = null;
 10:   PreparedStatement pstmt = null;
 11:   Connection conn = null;
 12:   String query = "insert into "+up.getTableName()+" (seq,re_step,
           re_level,name,title,pwd,email,readnum,writeday,ip,relativeCnt,
               homepage,imgInfo,content,tag) 
                   values(?,?,?,?,?,?,?,0,sysdate,?,0,?,?,empty_clob(),?)";
오라클 명령어 empty_clob()을 이용해 공간을 확보한다.
13: try{ 14: conn = DBManager.getClobConnection(); 15: conn.setAutoCommit(false);
CLOB column을 업데이트 하는동안 다른 process의 접근을 막기위해 
setAutoCommit(false)를 반드시 설정해야 한다. 이부분이 가장 중요하다.
16: pstmt = conn.prepareStatement(query); 17: pstmt.setInt(1,up.getSeq()); 18: pstmt.setInt(2,re_step); 19: pstmt.setInt(3,re_level); 20: pstmt.setString(4,up.getName()); 21: pstmt.setString(5,up.getTitle()); 22: pstmt.setString(6,up.getPwd()); 23: pstmt.setString(7,up.getEmail()); 24: pstmt.setString(8,up.getIp()); 25: pstmt.setString(9,up.getHomepage()); 26: pstmt.setString(10,up.getImgInfo()); 27: pstmt.setString(11,up.getTag()); 28: pstmt.executeUpdate(); 29: pstmt.close(); 30: String query2 = " select /*+ index_desc("+up.getTableName()+ " "+up.getTableName()+"_indx) */ content from "+ up.getTableName()+" where seq = ? for update ";
for update를 이용해 CLOB column을 lock한다.
31: pstmt = conn.prepareStatement(query2); 32: pstmt.setInt(1,up.getSeq()); 33: rs = pstmt.executeQuery(); 34: if(rs.next()) { 35: CLOB clob = ((OracleResultSet)rs).getCLOB(1); 36: Writer writer = clob.getCharacterOutputStream(); 37: Reader src = new CharArrayReader(up.getContent().toCharArray()); 38: char[] buffer = new char[1024]; 39: int read = 0; 40: while ( (read = src.read(buffer,0,1024)) != -1) { 41: writer.write(buffer, 0, read); // write clob. 42: } 43: src.close(); 44: writer.close(); 45: } 46: conn.commit(); 47: conn.setAutoCommit(true);
CLOB column에 데이터을 저장하였다면 commit()을 실행시키고 
conn.setAutoCommit(true)로 다시 설정한다.
48: }finally{ 49: DBManager.close(rs,pstmt,conn); 50: } 51: }


 

Clob 불러오기

...
  1: public BoardTable getViewData(String tableName,int seq) throws Exception
  2: {
  3:   BoardTable bTable = new BoardTable();
  4:   String query = " select * from "+tableName+" where seq = ? ";
  5:   ResultSet rs = null;
  6:   PreparedStatement pstmt = null;
  7:   Connection conn = null;
  8:   try{
  9:     conn = DBManager.getConnection();
 10:     pstmt = conn.prepareStatement(query);
 11:     pstmt.setInt(1,seq);
 12:     rs = pstmt.executeQuery();
 13:     if (rs.next()) {
 14:       ...
 15:       ...      
 16:       StringBuffer output = new StringBuffer();
 17:       Reader input = rs.getCharacterStream("content");
 18:       char[] buffer = new char[1024];
 19:       int byteRead;
 20:       while((byteRead=input.read(buffer,0,1024))!=-1){
 21:         output.append(buffer,0,byteRead);
 22:       }
 23:       input.close();
 24:       bTable.setContent(output.toString()); 

CLOB 데이터를 불러오기 위해서는 위에서처럼 
rs.getCharacterStream("content")로 불러서 StringBuffer에 담아야 한다.

25: ... 26: ... 27: } 28: } finally { 29: DBManager.close(rs,pstmt,conn); 30: } 31: return bTable; 32: }


출처 : http://www.gurubee.net/lecture/1870

댓글