2014년 8월 28일 목요일

Oracle Clob를 이용한 게시판 글내용 무제한으로 넣기 - 정민철[자바JSP/Servlet/JDBC/MiPlatform/XPlatform/교육/JSP/서블릿강좌/Spring교육잘하는곳/자바,JSP/spring/교육추천/JSP/JDBC실무교육]

Oracle 9i clob Type  

 Oracle 8i 이전 버전에서 대용량 처리는 long 타입으로 처리를 할 수 밖에 없었으며, 
이 칼럼은 한테이블에 하나만 사용할 수 있으며 (최대 크기 2GB) 더군다나 검색을 구현 
하기가 너무 어려워 포기를 해야 만 했습니다. 

 그래서 이런 문제를 보안하기 위해 나온 것이 바로 Oracle 8i부터 지원되는 대용량 데 
이터 저장 타입인 Lob(Large Object) Type 입니다.. 
  
 Lob 타입은 테이블에 여러개의 컬럼을 생성할 수 있으며 (최대 크기 4GB) 또한 long  
타입보다 훨씬 쉬운 검색기능을 제공합니다. 
  
 Lob type의 종류로는 이진 바이너리 데이터의 저장시 사용되는 Blob (Binary Large Object)와 
문서 데이터의 저장시 사용되는 Clob (Character Large Object) 그리고 
외부 파일에 저장된 이진 데이터가 있는 경로의 저장시 사용되는 BFILE 가 있습니다. 

  
 그럼 이중에서 Clob에 대해 알아보겠습니다. 

  
--------------- 
Clob에 저장하기 
--------------- 

 Clob 부연 설명을 한다면, 먼저 다른 데이터들을 먼저 데이터베이스에 넣고 그 다음 clob 
타입의 데이터를 update 해주는 방식입니다. 
그럼 자세히 알아보겠습니다. 

*참고:저는 DBConnect라는 자바빈즈를 사용하여 Oracle에 접속하였습니다. 

<jsp:useBean id="dbconn" class="jspBean.DBConnect" scope="application" /> 

    Connection  conn    = dbconn.getConnection();  
          // 자바빈즈로부터 데이터베이스 커넥션 받기 
    conn.setAutoCommit(false);  
          // Clob의 가장 중요한 부분 입니다. 
          // 반드시 CLOB column을 업데이트 하는동안 다른 process의 접근을  
          //막기위해 setAutoCommit(false)를 반드시 설정해야 합니다.  
  
    Statement  stmt    = null;  // SQL 구문 실행을 위한 Statement 선언 
    
    try { 
        stmt    = conn.createStatement();  // 커넥션으로부터 Statement 생성 
    } catch(SQLException e) { 
    } 
    
    query = "INSERT INTO gongzi VALUES (seq_gongzi_id.nextval,"; 
    query = query + "?,?,?,?,?,sysdate,empty_clob(),0,seq_gongzi_id.currval,?,?,?)"; 
          // empty_clob() 를 이용하여 공간을 확보하면서 insert 합니다. 

    PreparedStatement ps = conn.prepareStatement(query); 
      ps.setString(1, subject); 
      ps.setString(2, name); 
      ps.setString(3, password); 
      ps.setString(4, email); 
      ps.setString(5, homepage); 
      ps.setInt(6, step); 
      ps.setInt(7, position); 
      ps.setString(8,ip); 
    
    try { 
      ps.executeUpdate(); 
    } catch(SQLException e) { 
    } 
    ps.close(); 
    
    query = "select contents from gongzi where id = (select max(id) from gongzi)"; 
          //위에서 Insert한 데이터를 다시 가져옵니다. 

    ps = conn.prepareStatement(query); 
    rs = ps.executeQuery(); 
    if(rs.next()) { 
      CLOB clob = ((OracleResultSet)rs).getCLOB(1);        
      Writer writer = clob.getCharacterOutputStream(); 
      Reader src = new CharArrayReader(contents.toCharArray()); 
      char[] buffer = new char[1024]; 
      int read = 0; 
      while ( (read = src.read(buffer,0,1024)) != -1) { 
            writer.write(buffer, 0, read); // write clob. 
      } 
      src.close();        
      writer.close(); 
    } 
    conn.commit(); 
          // CLOB column에 데이터을 저장하였다면 commit()을 실행시키고  
    conn.setAutoCommit(true);  
          // conn.setAutoCommit(true)로 다시 설정합니다.  
      
    response.sendRedirect("list.jsp"); 
  



------------- 
Clob 불러오기 
------------- 

    query = "SELECT * FROM gongzi WHERE id = "+id ; 

    try { 
rs = stmt.executeQuery(query); 
    } catch(SQLException e) { 
    } 
    rs.next(); 

    String ip = rs.getString("ip"); 
    String subject = rs.getString("subject"); 
    String name = rs.getString("name"); 
    String email = rs.getString("email"); 
    String homepage = rs.getString("homepage"); 
    String created = rs.getString("created"); 

//---------------------------------------------- 
    StringBuffer output = new StringBuffer(); 
    Reader input = rs.getCharacterStream("contents"); 
    char[] buffer = new char[1024]; 
    int byteRead; 
    while((byteRead=input.read(buffer,0,1024))!=-1){ 
  output.append(buffer,0,byteRead); 
    } 
    
    String contents = output.toString(); 
          //CLOB 데이터를 불러오기 위해서는 위에서처럼  
          //rs.getCharacterStream("content")로  
          //불러서 StringBuffer에 담아야 합니다.  
//---------------------------------------------- 
    int hit = rs.getInt("hit")+1; 
    int ref = rs.getInt("ref");  
    int position = rs.getInt("position"); 

    rs.close(); 

글 제목에서 무제한이라고 했지만, 솔직히 무제한은 아닙니다..^^ 아시죠 4GB.  
텍스트로 4GB 넣으시려면 몇일 걸리지 않을까요.  


 기업100%환급/오라클/자바/스프링/안드로이드/닷넷C#/jQUERY개발… 오라클자바…12-271639
 [채용예정교육]오라클자바개발잘하는신입뽑기2개월과정,교육전취…오라클자바…12-111165
53 [평일주간]100%환급6건,안드로이드,자바,C#,스프링3.2,SQL,힌트/… 오라클자바…03-15924
52 [주말주간]C#, ASP.NET마스터 오라클자바…01-311088
51 [평일,기업100%환급]SQL기초에서 Schema Object까지 오라클자바…01-31827
50 [평일야간]HTML5, CSS3,Ajax, jQuery마스터과정 오라클자바…01-31784
49 [평일주간,평일야간,주말]Spring,MyBatis,Hibernate개발자과정 오라클자바…01-191055
48 [평일주간,평일야간,주말]안드로이드개발자과정 오라클자바…01-11953
47 [평일야간,주말주간]JAVA,Network&WEB&Framework 오라클자바…01-031459
46 기업100%환급/오라클/자바/스프링/안드로이드/닷넷C#/jQUERY개발… 오라클자바…12-271639
45 [평일야간,주말]자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis… 오라클자바…12-191184
44 웹퍼블리싱 마스터(HTML5,CSS3,jQUERY,AJAX,JavaScript) 오라클자바…12-141185
43 [채용예정교육]오라클자바개발잘하는신입뽑기2개월과정,교육전취… 오라클자바…12-111165
42 [평일,기업100%환급]자바기초에서 JDBC, Servlet/JSP까지 오라클자바…12-09937
41 [평일야간]닷넷(C#,Network,ADO.NET,ASP.NET)마스터 오라클자바…12-011095
40 [기업100%환급]C#4.0,WinForm,ADO.NET프로그래밍(평일주간(단기)… 오라클자바…12-011359
39 [평일야간,주말,주말야간]SQL기초에서실무까지(SQL기초,PLSQL,힌… 오라클자바…12-01829

댓글 없음:

댓글 쓰기