帮我看看如何提高效率

handsomeghost 2003-12-03 11:46:11
while (rs.next())
{ xmlbuffer.append("<REC ID="+"\""+rs.getRow()+"\""+">");
for (int i=1; i <= j; i++)
{ xmlbuffer.append("<SQL"+n+"_"+AscToUni(rsmd.getColumnName(i).trim())+">");
if (AscToUni(rs.getString(i)) == null)
xmlbuffer.append(" ");
else
xmlbuffer.append(AscToUni(rs.getString(i).replaceAll("<","<").replaceAll(">",">")));
xmlbuffer.append("</SQL"+n+"_"+AscToUni(rsmd.getColumnName(i).trim())+">");
}
xmlbuffer.append("</REC>");
}

这段代码目的是生成一个xml文件的一部分,由于数据量很大时生成速度很慢,请各位赐教提高其效率的办法.
...全文
30 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
cbhyk 2003-12-04
  • 打赏
  • 举报
回复
我只能做到这个程度了:

import java.io.UnsupportedEncodingException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;

public class DbSpeedTest
{
public static void main(String[] args)
{
Connection conn = null;
try
{
Class.forName("COM.ibm.db2.jdbc.app.DB2Driver");
conn = DriverManager.getConnection("jdbc:db2:testdb", "db2admin", "db2admin");
String sql = "SELECT * FROM sysibm.systables";
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);

long start = System.currentTimeMillis();

//doTest1(rs);
doTest2(rs);
//doTest3(rs);

long end = System.currentTimeMillis();
System.out.println("time use: " + (end - start) + "ms");

rs.close();
stmt.close();
}
catch (Exception e)
{
e.printStackTrace();
}

if (conn != null)
{
try
{
conn.close();
}
catch (SQLException e)
{
e.printStackTrace();
}
}
}

//测试从数据库取数据所需时间
private static void doTest3(ResultSet rs) throws SQLException
{
ResultSetMetaData rsmd = rs.getMetaData();
int j = rsmd.getColumnCount();
while (rs.next())
{
for (int i = 1; i <= j; i++)
{
String value = rs.getString(i);
}
}
}

//优化后的代码
private static void doTest2(ResultSet rs) throws SQLException
{
int recordCount = 0;
int n = 0;
StringBuffer xmlbuffer = new StringBuffer();
ResultSetMetaData rsmd = rs.getMetaData();
int j = rsmd.getColumnCount();

//String[] colNames = new String[j];
String[] colStart = new String[j];
String[] colEnd = new String[j];

for (int i = 0; i < j; i++)
{
//column name是英文,不需要转换
//colNames[i] = AscToUni(rsmd.getColumnName(i + 1).trim());
//colNames[i] = rsmd.getColumnName(i + 1);
String colName = rsmd.getColumnName(i + 1);

colStart[i] = new StringBuffer("<SQL").append(n).append('_').append(colName).append('>').toString();
colEnd[i] = new StringBuffer("</SQL").append(n).append('_').append(colName).append('>').toString();
}

while (rs.next())
{
xmlbuffer.append("<REC ID=\"").append(rs.getRow()).append("\">");
for (int i = 1; i <= j; i++)
{
xmlbuffer.append(colStart[i - 1]);

String value = rs.getString(i);
if (value == null)
xmlbuffer.append(' ');
else
xmlbuffer.append(encodeHtml(value));

xmlbuffer.append(colEnd[i - 1]);
}
xmlbuffer.append("</REC>");
}

//只作一次Asc到Unicode的转换
String xml = AscToUni(xmlbuffer.toString());
}

//优化前的代码
private static int doTest1(ResultSet rs) throws SQLException
{
int recordCount = 0;
int n = 0;
StringBuffer xmlbuffer = new StringBuffer();
ResultSetMetaData rsmd = rs.getMetaData();
int j = rsmd.getColumnCount();
while (rs.next())
{
recordCount++;
xmlbuffer.append("<REC ID=" + "\"" + rs.getRow() + "\"" + ">");
for (int i = 1; i <= j; i++)
{
xmlbuffer.append("<SQL" + n + "_" + AscToUni(rsmd.getColumnName(i).trim()) + ">");
if (AscToUni(rs.getString(i)) == null)
xmlbuffer.append(" ");
else
xmlbuffer.append(AscToUni(replace(replace(rs.getString(i), "<", "<"), ">", ">")));
xmlbuffer.append("</SQL" + n + "_" + AscToUni(rsmd.getColumnName(i).trim()) + ">");
}
xmlbuffer.append("</REC>");
}
return recordCount;
}

private static String AscToUni(String string)
{
if (string == null)
return null;
try
{
return new String(string.getBytes("iso-8859-1"));
}
catch (UnsupportedEncodingException e)
{
return string;
}
}

private static String encodeHtml(String value)
{
return replace(replace(value, '<', "<"), '>', ">");
}

private static String replace(String s, char c, String newString)
{
if(s == null)
return s;
int start = 0;
int end = s.indexOf(c);
StringBuffer result = new StringBuffer(s.length());
while (end != -1)
{
result.append(s.substring(start, end));
result.append(newString);
start = end + 1;
end = s.indexOf(c, start);
}
result.append(s.substring(start, s.length()));
return result.toString();
}

public static String replace(String s, String oldString, String newString)
{
StringBuffer result = new StringBuffer();
replace(s, oldString, newString, result);
return result.toString();
}

public static void replace(String s, String oldString, String newString, StringBuffer resultBuffer)
{
if(s == null)
return;
int start = 0;
int end = s.indexOf(oldString);
while (end != -1)
{
resultBuffer.append(s.substring(start, end));
resultBuffer.append(newString);
start = end + oldString.length();
end = s.indexOf(oldString, start);
}
resultBuffer.append(s.substring(start, s.length()));
}
}

运行情况:
记录数469,字段数46

1.运行doTest3()
time use: 1873ms
time use: 1903ms
time use: 1883ms
time use: 1922ms
time use: 1873ms

2.运行doTest1()
time use: 3866ms
time use: 3956ms
time use: 3886ms
time use: 3916ms
time use: 3896ms

3.运行doTest2()
time use: 2413ms
time use: 2383ms
time use: 2383ms
time use: 2333ms
time use: 2443ms
cbhyk 2003-12-04
  • 打赏
  • 举报
回复
我试了一下,慢主要是由AscToUni方法引起的,我的AscToUni实现:
public static String AscToUni(String s)
{
if(string == null)
return null;
try
{
return new String(string.getBytes("iso-8859-1"));
}
catch (UnsupportedEncodingException e)
{
return string;
}
}
运行结果:
record count: 1622
time use: 4826ms

把该方法改成直接返回,速度明显加快:
public static String AscToUni(String string)
{
return string;
}
运行结果:
record count: 1622
time use: 1141ms
yu_shi_bin 2003-12-03
  • 打赏
  • 举报
回复
每次的replaceAll都会产生新的字符串
不知道你最终是不是把这个xmlbuffer写到一个文件??
不如直接写 不必组成一个很长的string


rsmd.getColumnName(i) 这个最好定义成一个变量
wangwei1998 2003-12-03
  • 打赏
  • 举报
回复
xml文档可以分段操作,您可以试试。


handsomeghost 2003-12-03
  • 打赏
  • 举报
回复
883条
time use:6094ms
time use:4235ms
time use:4219ms
time use:4187ms
time use:4359ms
time use:4203ms
time use:4453ms


handsomeghost 2003-12-03
  • 打赏
  • 举报
回复
time use:5672ms
我刚测的结果
cbhyk 2003-12-03
  • 打赏
  • 举报
回复
如果仅有800条数据的话,这段代码应该花不了多少时间,可能是别的地方慢。
cbhyk 2003-12-03
  • 打赏
  • 举报
回复
测一下运行这段代码究竟要花多少时间:
long start = System.currentTimeMillis();
while(rs.next())
{
...
}
long end = System.currentTimeMillis();
System.out.println("time use:" + (end - start) + "ms");
handsomeghost 2003-12-03
  • 打赏
  • 举报
回复
我按照 cbhyk() 的方法试过了可是整个速度没有明显的提高,当数据为800条时,需要5s浏览器才显示出数据。
100条以内时速度可以接受

换一次replaceall是不行的,因为做这个替换的原因就是避免在XML内容中出现‘〈’‘〉’。如果换一次就会吧。整个标记都换没了。

我的做法是将整个xml文件发送到客户端,客户端根据指定的XSl显示为html。其中XSL放在服务器下,这么做是不是也影响速度。
cbhyk 2003-12-03
  • 打赏
  • 举报
回复
只作一次replaceall怎么行,
<REC ...>
<SQL...>
</SQL...>
</REC>
岂不是也被replace成了
<REC ...>
<SQL...>
</SQL...>
</REC>
zxl19790710 2003-12-03
  • 打赏
  • 举报
回复
只作一次replaceall
haley_hj 2003-12-03
  • 打赏
  • 举报
回复
支持楼上的....
cbhyk 2003-12-03
  • 打赏
  • 举报
回复
1.不要用JDK提供的replaceAll方法,自己写一个。例如:
public static String replace(String s, String oldString, String newString)
{
StringBuffer result = new StringBuffer();
replace(s, oldString, newString, result);
return result.toString();
}

public static void replace(String s, String oldString, String newString, StringBuffer resultBuffer)
{
int start = 0;
int end = s.indexOf(oldString);
while(end != -1)
{
resultBuffer.append(s.substring(start, end));
resultBuffer.append(newString);
start = end + oldString.length();
end = s.indexOf(oldString, start);
}
resultBuffer.append(s.substring(start, s.length()));
}

2.
这种代码
xmlbuffer.append("</SQL"+n+"_"+AscToUni(rsmd.getColumnName(i).trim())+">");
改一下:
xmlbuffer.append("</SQL".append(n).append("_").append(AscToUni(rsmd.getColumnName(i).trim()).append(">"));

3.在while(rs.next())前用一个数组把rsmd.getColumnName(i).trim()存起来
iamwls 2003-12-03
  • 打赏
  • 举报
回复
要不,最后做一次replaceAll吧

希望优化完后,将结果公布一下
yugona 2003-12-03
  • 打赏
  • 举报
回复
同意是replaceAll造成的。

尽量减少使用replaceAll()方法的次数。

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧