2015-03-27 3 views
0

У меня есть задача прочитать CLOB-файлы из базы данных Oracle 9i и записать их в файлы. У меня есть работы для небольших файлов, но в случае больших файлов, около 200 МБ, это занимает около 5 часов для одного файла, что совершенно неприемлемо. Я уверен, что это можно сделать быстрее, но я не знаю, как это сделать. Это то, что у меня есть:Чтение и запись больших файлов CLOB из базы данных Быстрее

//get the Clob record from the database and convert it to String 
public String getClobRecord() { 
     Connection conn; 
     Clob xmlCont; 
     ResultSet rset; 
     PreparedStatement stmt; 
     try { 
      conn = db.prepareConn(); 
      String sql = "select a.clob_clm from xml_statement a where period_id = ?"; 
      stmt = conn.prepareStatement(sql); 
      stmt.setInt(1, pid); 
      rset = stmt.executeQuery(); 
      while (rset.next()) { 
       xmlCont = rset.getClob(1); 
       xml = ClobStringConversion(xmlCont); 
      } 

      stmt.close(); 
      DBConnect.closeConn(conn); 
     } catch (SQLException asd) { 
      log.fatal(asd.getMessage()); 
     } catch (IOException asd) { 
      log.fatal(asd.getMessage()); 
     } 
     return xml; 
    } 
//My CLOB to String Conversion Method 
    public static String ClobStringConversion(Clob clb) throws SQLException, IOException { 
     if (clb == null) { 
      return ""; 
     } 
     StringBuilder str = new StringBuilder(); 
     String strng; 
     BufferedReader br = new BufferedReader(clb.getCharacterStream()); 
     while ((strng = br.readLine()) != null) { 
      str.append(strng); 
     } 

     return str.toString(); 
    } 
//Write the String to File 
public void writeXmlToFile(String fileDir, String xmlFileName) { 
     File xmlfile = new File(fileDir + "/" + xmlFileName); 
     xml = this.getClobRecord(); 
     try { 
      BufferedWriter bw = new BufferedWriter(new FileWriter(xmlfile)); 
      bw.write(formatXmlFile()); 
      bw.close(); 
     } catch (IOException asd) { 
      log.fatal(asd.getMessage()); 
     } 
    } 

Что именно следует изменить для размещения очень больших файлов CLOB?

+2

Я удивлен, что вы ждали 5 часов для завершения теста. – immibis

+0

Не совсем :) Оставшись на ночь ... Проверял журналы позже .. Это заняло много времени. – ErrorNotFoundException

+0

Сколько времени в строках данных? – immibis

ответ

1

Если вы настаиваете на том, чтобы хранить данные о clob в памяти, одна вещь, которую вы можете улучшить, - это использовать функцию оракула.

public static String toString(final Clob clob) 
    throws SQLException, IOException { 

    if (clob == null) { 
     return ""; 
    } 

    Long length = null; 

    // try to get the oracle specific CLOB length 
    // no vendor-specific code here. 
    try { 
     final Class<?> oracleClobClass = Class.forName("oracle.sql.CLOB"); 
     if (oracleClobClass.isInstance(clob)) { 
      length = (Long) oracleClobClass.getMethod("getLength", null) 
        .invoke(clob, null); 
     } 
    } catch (final Exception e) { 
    } 

    // we can set initial capacity if we got the length. 
    final StringBuilder builder 
     = length == null 
     ? new StringBuilder() : new StringBuilder(length.intValue()); 

    final BufferedReader reader 
     = new BufferedReader(clob.getCharacterStream()); 
    for (String line = null; (line = reader.readLine()) != null;) { 
     builder.append(line); 
    } 

    return builder.toString(); 
} 
Смежные вопросы