大家好:我封装了一个读取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();
}
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();
}
至于Oracle的优化参数,这里你应该用不上,因为你是在Java端做的处理
char[] c = new char[(int) clob.length()];
inStream.read(c);
content = new String( c );
你这个buf开辟得也太大了。
弄成最多16*1024就够了。
你这个buf开辟得也太大了。[code=Java]
弄成最多16*1024就够了。[/code]这个代码中BUF不论大和小程序速度都开不起来,不过代码在服务器上运行速度比在PC上还是快许多,至少要快10倍以上,只是感觉这个代码有问题,只读取一条记录中的CLOB为何如此慢