java中无需编码即可快速将CLOB转换为字符串

java中无需编码即可快速将CLOB转换为字符串,java,string,oracle,jdbc,clob,Java,String,Oracle,Jdbc,Clob,我有一个问题:在我的应用程序中,CLOB转换为字符串的速度非常慢。例如,将VARCHAR2(40)转换为字符串需要0.0001毫秒,将CLOB(~1600)转换为字符串需要0.8毫秒。 要转换为1600/40=40倍多的字节,需要0.8/0.001=800倍多的时间(慢20倍) 我皈依 ResultSet rs = ... while (rs.next()){ Clob clob = rs.getClob(3); String s = clob.getSubString(1,

我有一个问题:在我的应用程序中,CLOB转换为字符串的速度非常慢。例如,将VARCHAR2(40)转换为字符串需要0.0001毫秒,将CLOB(~1600)转换为字符串需要0.8毫秒。 要转换为1600/40=40倍多的字节,需要0.8/0.001=800倍多的时间(慢20倍) 我皈依

ResultSet rs = ... 
while (rs.next()){ 
   Clob clob = rs.getClob(3); 
   String s = clob.getSubString(1, MAX_TEXTITEM_LENGTH); 
   ... 
打开
Clob.getCharacterStream()
也需要很多时间。。。 我想,是编码方面的问题还是别的什么?需要建议

Oracle数据库使用UTF-8字符集

更新。问题在于:“By驱动程序使用SQL定位器(Clob)实现Clob对象,这意味着Clob对象包含指向SQL Clob数据的逻辑指针,而不是数据本身。”如何内联获取Clob值(使用next()时)


p.S.Sry表示糟糕的英语。

我尝试使用以下方法:

public static String clobToString(Clob data) {
    long dataL = System.currentTimeMillis();
    StringBuilder sb = new StringBuilder();
    if (data != null) {
        Reader reader = null;
        BufferedReader br = null;
        try {
            reader = data.getCharacterStream();
            br = new BufferedReader(reader);
            String line;
            while (null != (line = br.readLine())) {
                sb.append(line);
            }
        } catch (SQLException e) {
            logger.error(getClassAndMethodNameRuntime(), e);
        } catch (IOException e) {
            logger.error(getClassAndMethodNameRuntime(), e);
        } finally {
            closeObject(br);
            closeObject(reader);
        }
    }
    logger.trace("CLOB CONVERSION TIME1 ms: " + (System.currentTimeMillis() - dataL) + " Character: " + sb.length());
    return sb.toString();
}

转换时间变化很大:

  • CLOB转换时间1毫秒:87.493707字符:7976
  • CLOB转换时间2毫秒:29.231168字符:8000
  • CLOB转换时间1毫秒:14.849225字符:5617
  • CLOB转换时间2毫秒:30.062757字符:5618
  • CLOB转换时间1毫秒:0.03323字符:3995
  • CLOB转换时间2毫秒:0.014769字符:3996
  • CLOB转换时间1毫秒:0.025846字符:3414
  • CLOB转换时间2毫秒:0.023795字符:3415
你试过用这个说法吗

select dbms_lob.substr(dettXML__C, 4000, 1) from TABLE

为什么不在查询中执行
dbms\u lob.substr
,然后使用
rs.getString()
?如果该值大于4k,则所提取的数据超过了需要的数据量。或者
MAX\u TESTITEM\u LENGTH
是否高于4k
varchar2
限制?因为有时CLOB大小超过64K,但提供的是1-2K,但您仅使用了部分长度-MAX\u TEXTITEM\u LENGTH是否可以超过4k?如果不能,那么您最好在数据库中执行子字符串,只传输您实际需要的数据?是的,它可以超过4k,因为我需要传输整个表。
select dbms_lob.substr(dettXML__C, 4000, 1) from TABLE