使用MySQL连接器在Java Servlet中缓慢响应XML

时间:2010-07-12 10:17:19

标签: java servlets jdbc

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

我的Servlet相关功能是: (运行查询并在String变量中返回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;
}

5 个答案:

答案 0 :(得分:2)

字符串连接:

首先,当速度很重要时,你不希望以你的方式连接字符串。每次连接String时,您都要创建一个新的。

最好使用具有良好计划容量的StringBuilder,因为从您显示的代码段判断,默认值不太适合您的需求。

另见:

String, StringBuffer, and StringBuilder

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

<强> XML:

  

XStream是一个简单的库   将对象序列化为XML并返回   试。

可能与您的效果问题无关,但可能派上用场:XStream

“性能”确实列在其功能列表中。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

我不希望这会导致这个和你的其他实现之间的分钟差异,所以其他可能是问题(可能是缺少表索引?) 如果您可以在代码中添加日志记录,以便了解所有这些时间花在哪里,我们可以提供更具体的建议。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

如果要连接大量数据,可能会使用StringBuffer而不是String。