我正在编写一个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:在方法中使用BufferedReader
和StringBuilder
(性能更佳?):
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 在性能方面更好,所以我想了解:
答案 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();
}
我认为这不会对表现产生任何影响。