2010-07-12 94 views
0

我创建了一个Java Servlet,它从mySQL数据库获取查询结果并以XML格式打印。 问题是,它需要很长时间,大约三分钟来打印xml结果,而在我的PHP脚本中需要5秒钟。使用MySQL连接器的Java Servlet中的缓慢XML响应

我的servlet相关功能是: (运行查询,并在一个字符串变量返回的XML,那么,它打印的页面)

public String QueryResult(String query) 
{ 
    String retStr; 
    try { 
     Class.forName("com.mysql.jdbc.Driver"); 
     Connection conn = DriverManager.getConnection ("jdbc:mysql://"+this.host+":"+this.port+"/"+this.db, this.user, this.pass); 
     Statement stmt = conn.createStatement(); 
     ResultSet rset = stmt.executeQuery(query); 
     ResultSetMetaData rsMetaData = rset.getMetaData(); 

     retStr = "<Result>\n"; 
     while (rset.next()) 
     { 
      retStr += "\t<Item>\n"; 
      for (int i=1;i<=rsMetaData.getColumnCount();i++) 
      { 
       retStr += "\t\t<"+rsMetaData.getColumnName(i)+">"+ rset.getString(i) + "</"+rsMetaData.getColumnName(i)+">\n"; 
      } 
      retStr += "\t</Item>\n"; 
     } 
     retStr += "</Result>\n"; 
     stmt.close(); 
     conn.close(); 
    } 
    catch(Exception e) 
    { 
     return "<Result><Error>"+e.toString()+"</Error></Result>"; 
    } 
    return retStr; 
} 
+0

你知道这个方法的哪个部分花时间吗?它只是对executeQuery()的调用,还是构建结果的循环?此外,这种方法被调用一次或多次? – 2010-07-12 10:24:55

回答

2

字符串连接:

首先,当速度的问题,你不想来连接字符串你的方式。每次连接String时,都会创建一个新的。

更好地使用StringBuilder以及良好的计划容量,因为根据您显示的代码片断,默认值不适合您的需要。

另请参见:

String, StringBuffer, and StringBuilder

Why to use StringBuffer in Java instead of the string concatenation operator

XML:

XStream有一次一个简单的库 序列化对象到XML和背部 。

可能无法与您的性能问题,但可能会派上用场:XStream

在他们的功能列表“性能”确实数字。

0

如果有大量的数据来连接的,也许你会使用StringBuffer而不是String。

1

您应该尝试使用StringBuilder来连接XML数据。这样可以避免连续复制到目前为止收集的数据。稍微改进也可以是将初始容量(在StringBuilders构造函数中)设置为预期大小。

1

Java中的字符串是不可变的,这意味着您的代码会创建并销毁很多字符串对象。一个明显的优化是使用StringBuilderStringBuffer来建立你的结果。

我不希望这会导致这与你的其他实现之间的分钟差异,所以别的可能是这个问题(缺少表索引也许?) 如果你可以添加日志记录到你的代码,所以你得到所有这些时间都花在这个概念上,我们可以给出更具体的建议。

1

创建/打开/关闭连接需要很长时间。 servlet创建自己的连接并不好 - 更好地使用连接池。

+0

我是Java新手,你可以参考我的连接池信息吗? – Elad 2010-07-12 10:49:53

+0

请阅读:http://www.javaranch.com/journal/200601/JDBCConnectionPooling.html 和http://dev.mysql.com/tech-resources/articles/connection_pooling_with_connectorj.html – burnall 2010-07-13 09:15:40