Медленный XML-ответ в сервлете Java с коннектором MySQL - PullRequest
0 голосов
/ 12 июля 2010

Я создал сервлет Java, который получает результат запроса из базы данных mySQL и печатает его в формате XML.проблема в том, что для распечатки результата xml требуется очень много времени, около трех минут, в то время как в моем PHP-скрипте это занимает 5 секунд.

Моя функция, относящаяся к сервлету: (запустите запрос и верните 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 ]

2 голосов
/ 12 июля 2010

Объединение строк:

Прежде всего, когда скорость имеет значение, вы не хотите объединять строки, как вы это делаете.Каждый раз, когда вы объединяете String, вы создаете новый.

Лучше использовать StringBuilder с хорошо спланированной емкостью, поскольку значение по умолчанию, вероятно, не будет соответствовать вашим потребностям, судя по фрагменту кода, который вы показываете.

См. Также:

String, StringBuffer и StringBuilder

Почему вместо этого следует использовать StringBuffer в Javaоператора конкатенации строк

XML:

XStream - это простая библиотека для сериализации объектов в XML и обратно.

Возможно, это не связано с проблемой производительности, но может пригодиться: XStream

"Производительность" фигурирует в списке их функций.

1 голос
/ 12 июля 2010

Создание / открытие / закрытие соединения занимает много времени.Сервлету нехорошо создавать собственное соединение - лучше использовать пул соединений.

1 голос
/ 12 июля 2010

Строки в Java являются неизменяемыми, это означает, что ваш код создает и уничтожает множество строковых объектов. Очевидной оптимизацией будет использование StringBuilder или StringBuffer для построения вашего результата.

Я бы не ожидал, что это приведет к разнице в минутах между этой и вашей другой реализацией, так что проблема может быть в другом (возможно, отсутствует индекс таблицы?) Если вы можете добавить протоколирование в свой код, чтобы вы могли понять, на что тратится все это время, мы могли бы дать более конкретный совет.

1 голос
/ 12 июля 2010

Вы должны попытаться использовать StringBuilder для объединения XML-данных. Это позволяет избежать непрерывного копирования данных, собранных до сих пор. Незначительным улучшением также может быть установка начальной емкости (в конструкторе StringBuilders) на ожидаемый размер.

0 голосов
/ 12 июля 2010

Если требуется объединить много данных, возможно, вы бы использовали StringBuffer вместо String.

...