簡體   English   中英

使用MySQL連接器的Java Servlet中的XML響應緩慢

[英]Slow XML response in Java Servlet with MySQL connector

我創建了一個Java Servlet,該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;
}

字符串串聯:

首先,當速度很重要時,您不想以這種方式連接字符串。 每次連接一個String您都會創建一個新的String

最好以計划好的容量使用StringBuilder ,因為從顯示的代碼片段來看,默認的版本可能不適合您的需求。

另請參閱:

String,StringBuffer和StringBuilder

為什么在Java中使用StringBuffer代替字符串連接運算符

XML:

XStream是一個簡單的庫,用於將對象序列化為XML並再次返回。

可能與您的性能問題無關,但可能會派上用場: XStream

“性能”確實在其功能列表中顯示。

您應該嘗試使用StringBuilder連接XML數據。 這樣可以避免連續復制到目前為止收集的數據。 較小的改進還可以是將初始容量(在StringBuilders構造函數中)設置為預期的大小。

Java中的字符串是不可變的,這意味着您的代碼會創建和銷毀許多字符串對象。 一個明顯的優化方法是使用StringBuilderStringBuffer生成結果。

我不希望這會導致此實現與您的其他實現之間有幾分鍾的差異,所以可能還有其他問題(也許是缺少表索引嗎?)如果您可以將日志記錄添加到代碼中,以便您了解所有這些代碼花時間了,我們可以提供更具體的建議。

創建/打開/關閉連接需要很多時間。 servlet創建自己的連接不好-更好地使用連接池。

如果要串聯的數據很多,也許您將使用StringBuffer而不是String。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM