Более быстрый способ использовать данные из массива String? - PullRequest
0 голосов
/ 14 января 2011

В настоящее время у меня читается таблица примерно так:

        ps = con.prepareStatement("SELECT * FROM testrow;");
        rs = ps.executeQuery();
        rs.next();
        String[] skills = rs.getString("skills").split(";");
        String[] skillInfo;
        for (int i = 0; i < skills.length; i++) {
            skillInfo = skills[i].split(",");
            newid.add(Integer.parseInt(skillInfo[0]));
            newspamt.add(Byte.parseByte(skillInfo[1]));
            mastery.add(Byte.parseByte(skillInfo[2]));
        }
        rs.close();
        ps.close();

Информация сохраняется в базе данных с помощью StringBuilder, чтобы сформировать строку из всех чисел, которые должны быть сохранены, в формате number1, number2, number3;

Я написал тестовый проект, чтобы увидеть, будет ли этот метод быстрее, чем при использовании пакетного метода MySQL, и он побил MySQL примерно на 3 секунды. Единственная проблема, с которой я сталкиваюсь сейчас, это когда я иду, чтобы прочитать информацию, MySQL завершает работу за несколько миллисекунд, где при вызове информации с использованием String [] для разделения данных на ";" символ, а затем также использование String [] для разделения информации внутри цикла по символу "," занимает от 3 до 5 секунд.

Можно ли в любом случае сократить время, необходимое для загрузки данных, используя String [] или, возможно, другой метод?

Ответы [ 7 ]

3 голосов
/ 14 января 2011

Не хранить сериализованные массивы в полях базы данных. Используйте 3NF ?

1 голос
/ 14 января 2011

String.split использует регулярное выражение для своего алгоритма.Я не так, как это реализовано, но есть вероятность, что процессор довольно тяжелый.Попробуйте реализовать собственный метод split, используя значение char вместо регулярного выражения.

1 голос
/ 14 января 2011

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

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

1 голос
/ 14 января 2011

в формате № 1, № 2, № 3

рассмотрите возможность нормализации таблицы, давая одно число в строке.

0 голосов
/ 14 января 2011

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

0 голосов
/ 14 января 2011

Я рекомендую вместо использования метода split использовать предварительно скомпилированное регулярное выражение, особенно в цикле.

0 голосов
/ 14 января 2011

Удалите индекс при вставке, это ускорит его.

Конечно, это только опция для пакетной загрузки, а не для транзакций с 500-в-секунду.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...