Clob to String:BufferedReader vs getSubString()?

时间:2014-04-04 23:35:45

标签: java jdbc clob

我正在编写一个Java程序来从包含XML数据的数据库中读取clob列并进行一些处理。

我需要在此XML内容上使用Regex,因此转换为字符串对我来说是一种有用的方法,并且我确信clob的长度不会超出字符串的容量以用于操作目的。截至目前,最短和最长的CLOB来自约。 4000 数据库中的总条目分别为 2000 字符和 18000 字符。

我的问题是:有了这种最大长度(比如20k字符),建议采用以下两种方法中的哪一种?为什么?

方法1: Clob上的方法getSubString(),更易于使用:

// cXML is the Clob object   
String sXML = cXML.getSubString(1, (int)cXML.length());


方法2:在方法中使用BufferedReaderStringBuilder(性能更佳?):

private String ClobToString(Clob data)
throws Exception
{
    StringBuilder sb = new StringBuilder();
    StringBuilder exDtl = new StringBuilder();
    try {
        Reader reader = data.getCharacterStream();
        BufferedReader br = new BufferedReader(reader);
        String line;
        while(null != (line = br.readLine())) {
            sb.append(line + "\n");
        }
        br.close();
    } catch (SQLException e) {
        exDtl.append(e.getMessage());
    } catch (IOException e) {
        exDtl.append(e.getMessage());
    }
    finally
    {
        if (exDtl.length() > 0)
        {
            throw new Exception(exDtl.toString());
        }
        return sb.toString();
    }
} // End Method ClobToString

我在一些网站/论坛上看到方法2 在性能方面更好,所以我想了解:

  1. 使用方法2 代替方法1
  2. ,建议使用Clob长度的阈值是什么?
  3. 这两种方法都不推荐,如果是这样,那么第三种方法是什么?
    (我希望避免像StreamFlyer这样的第三方库)

1 个答案:

答案 0 :(得分:1)

方法2的实现是有缺陷的,因为无论如何都不以流方式处理数据,使用方法1.方法1将调用驱动程序的方法2的实现,这可能更准确并且可能看起来像某些东西像这样:

public static String getString(Clob data) throws SQLException {

    StringBuilder sb = new StringBuilder();
    char[] cbuf = new char[8192];
    int l = 0;
    try (Reader r = data.getCharacterStream()) {
        while ((l = r.read(cbuf)) > -1) {
            sb.append(cbuf, 0, l);
        }
    } catch (IOException ioe) {
        throw new SQLException("Unable to read character stream from Clob.", ioe);
    }
    return sb.toString();
}

我认为这不会对表现产生任何影响。