Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用MySQL连接器的Javaservlet中的XML响应速度慢_Java_Servlets_Jdbc - Fatal编程技术网

使用MySQL连接器的Javaservlet中的XML响应速度慢

使用MySQL连接器的Javaservlet中的XML响应速度慢,java,servlets,jdbc,Java,Servlets,Jdbc,我创建了一个Javaservlet,它从mySQL数据库获取查询结果并以XML格式打印出来。 问题是打印xml结果需要很长的时间,大约三分钟,而在我的PHP脚本中需要5秒钟 我的Servlet相关功能是: (运行查询并以字符串变量形式返回xml,然后将其打印到页面) 公共字符串查询结果(字符串查询) { 字符串retStr; 试一试{ Class.forName(“com.mysql.jdbc.Driver”); Connection conn=DriverManager.getConnecti

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

我的Servlet相关功能是: (运行查询并以字符串变量形式返回xml,然后将其打印到页面)

公共字符串查询结果(字符串查询)
{
字符串retStr;
试一试{
Class.forName(“com.mysql.jdbc.Driver”);
Connection conn=DriverManager.getConnection(“jdbc:mysql://“+this.host+”:“+this.port+”/“+this.db,this.user,this.pass”);
语句stmt=conn.createStatement();
ResultSet rset=stmt.executeQuery(查询);
ResultSetMetaData rsMetaData=rset.getMetaData();
retStr=“\n”;
while(rset.next())
{
retStr+=“\t\n”;

对于(int i=1;i如果有大量数据要连接,可能会使用StringBuffer而不是String。

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

字符串连接:

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

最好将
StringBuilder
与精心规划的容量一起使用,因为从您显示的代码片段来看,默认的容量可能不适合您的需要

另请参见:

XML:

XStream是一个简单的 将对象序列化为XML并返回 再说一遍

可能与您的性能问题无关,但可能有用:


“性能”确实出现在他们的功能列表中。

字符串连接:

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

最好将
StringBuilder
与精心规划的容量一起使用,因为从您显示的代码片段来看,默认的容量可能不适合您的需要

另请参见:

XML:

XStream是一个简单的 将对象序列化为XML并返回 再说一遍

可能与您的性能问题无关,但可能有用:


“性能”确实在他们的功能列表中有所体现。

您应该尝试使用连接来连接XML数据。这避免了对迄今为止收集的数据的持续复制。一个小的改进还可以是设置初始容量(在StringBuilders构造函数中)达到预期大小。

您应该尝试使用连接XML数据。这样可以避免连续复制到目前为止收集的数据。一个小的改进还可以是设置初始容量(在StringBuilders构造函数中)Java中的字符串是不可变的,这意味着您的代码会创建和销毁许多字符串对象。一个明显的优化方法是使用
StringBuilder
StringBuffer
来生成结果

我不认为这会导致此实现与其他实现之间的差异,因此可能存在其他问题(可能是缺少表索引?)
如果您可以在代码中添加日志记录,以便了解所有时间都花在了哪里,我们可以给出更具体的建议。

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

我不认为这会导致此实现与其他实现之间的差异,因此可能存在其他问题(可能是缺少表索引?)
如果您可以在代码中添加日志记录,以便了解这些时间都花在了哪里,我们可以给出更具体的建议。

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

创建/打开/关闭连接需要很多时间。这对r servlet创建自己的连接-最好使用连接池。

您知道此方法的哪一部分需要花费时间吗?这只是调用executeQuery()吗或者是构造结果的循环?还有,这个方法被调用一次还是多次?你知道这个方法的哪一部分需要花费时间吗?只是调用executeQuery()吗或者是构造结果的循环?还有,这个方法是被调用一次还是多次?我是Java新手,你能让我参考连接池信息吗?请阅读:我是Java新手,你能让我参考连接池信息吗?请阅读:和
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;
}