大家好:我封装了一个读取Clob 对象的方法,当Clob字段内容小的时候速度还可以,当内容略微大一点速度慢的惊人,最久时能达到一分钟,我监控了一下主要慢在reader.read(buf)这边,之前使用reader.readln()方法也是一样慢方法如下,请大家帮忙看看有没有优化方法谢谢!
public String getClob(Clob clob){
    
System.out.println("clobbegin:"+(new java.util.Date()).toLocaleString());
if (clob == null)
{
return null;
}
Reader reader = null;
BufferedReader bf = null;
StringBuffer content = new StringBuffer();
try 
{
System.out.println("clobbeginreadchar:"+(new java.util.Date()).toLocaleString());
//reader = clob.getCharacterStream();
//System.out.println("clobendreadchar:"+(new java.util.Date()).toLocaleString());
//bf = new BufferedReader(reader);

String tmp = "";
 char  buf[] =  new   char [1024*1024];   
 reader = clob.getCharacterStream();   
 System.out.println("clobendreadbuffer:"+(new java.util.Date()).toLocaleString());
while (reader.read(buf) != -1) 
{
System.out.println("readdata:"+(new java.util.Date()).toLocaleString());
//if (content.length() != 0)
//{
//content.append("\n");
//}
content.append(buf);

}
System.out.println((new java.util.Date()).toLocaleString());


catch (Exception e) 
{
e.printStackTrace();

finally 
{
try {
//bf.close();
bf = null;
reader.close();
reader = null;
} catch (IOException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}

}

return content.toString();
}

解决方案 »

  1.   

    我在网上看有的朋友说ORACLE有优化参数,不知道是什么样的参数,如果有知道的朋友还请指教 谢谢
      

  2.   

    记得之前看过有人说,读取blob、clob等大字段的时候,不要用select * from....你呢?
    至于Oracle的优化参数,这里你应该用不上,因为你是在Java端做的处理
      

  3.   

    在写SQL时都没有用select * from而且目前我见了很多时间标志,最后显示速度慢在while (reader.read(buf) != -1) 这个语句,现在看应该的确是应该和数据库没有关系
      

  4.   

    尝试直接写inStream = clob.getCharacterStream();
    char[] c = new char[(int) clob.length()];
    inStream.read(c);
    content = new String( c );
      

  5.   

    char buf[] = new char [1024*1024];
    你这个buf开辟得也太大了。
    弄成最多16*1024就够了。
      

  6.   

    oracle对blob的支持,效率就是低啊。前两天刚测了一下,一个表有200个4000大小(默认)的blob字段,插入10000条记录,c#查询需要20多分钟,不可用啊。
      

  7.   

    需要看你clob里面存放内容的大小吧
      

  8.   

    网上char[] c = new char[(int) clob.length()];这个写法是错误的,clob内容很大时clob.length()强转为整形会产生溢出的
      

  9.   

    char buf[] = new char [1024*1024];
    你这个buf开辟得也太大了。[code=Java]
    弄成最多16*1024就够了。[/code]这个代码中BUF不论大和小程序速度都开不起来,不过代码在服务器上运行速度比在PC上还是快许多,至少要快10倍以上,只是感觉这个代码有问题,只读取一条记录中的CLOB为何如此慢