[英]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中的字符串是不可變的,這意味着您的代碼會創建和銷毀許多字符串對象。 一個明顯的優化方法是使用StringBuilder
或StringBuffer
生成結果。
我不希望這會導致此實現與您的其他實現之間有幾分鍾的差異,所以可能還有其他問題(也許是缺少表索引嗎?)如果您可以將日志記錄添加到代碼中,以便您了解所有這些代碼花時間了,我們可以提供更具體的建議。
創建/打開/關閉連接需要很多時間。 servlet創建自己的連接不好-更好地使用連接池。
如果要串聯的數據很多,也許您將使用StringBuffer而不是String。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.