Моя проблема заключается в следующем: Я пытаюсь обрабатывать около 1,5 миллионов строк данных весной через JDBCTemplate, исходящие из MySQL. С таким большим количеством строк я использую класс RowCallbackHandler, как предложено hereОптимизация результата Получение производительности (Apache Spring, MySQL)
Код на самом деле работает, но SLOW ... Дело в том, что независимо от того, для чего я установил размер выборки, я, кажется, получаю приблизительно 350 записей на выборку, с задержкой от 2 до 3 секунд между выборками (от наблюдения за моими журналами). Я попробовал комментировать команду хранилища и подтвердил, что поведение оставалось неизменным, поэтому проблема не связана с записью.
Есть 6 столбцов, только 1, что является varchar, и что он имеет длину всего 25 символов, поэтому я не вижу проблемы с пропускной способностью.
В идеале я хотел бы получить больше, чем 30000-50000 строк за раз. Есть ли способ сделать это?
Вот мой код:
protected void runCallback(String query, Map params, int fetchSize, RowCallbackHandler rch)
throws DatabaseException {
int oldFetchSize = getJdbcTemplate().getFetchSize();
if (fetchSize > 0) {
getJdbcTemplate().setFetchSize(fetchSize);
}
try {
getJdbcTemplate().query(getSql(query), rch);
}
catch (DataAccessException ex) {
logger.error(ExceptionUtils.getStackTrace(ex));
throw new DatabaseException(ex.getMessage());
}
getJdbcTemplate().setFetchSize(oldFetchSize);
}
and the handler:
public class SaveUserFolderStatesCallback implements RowCallbackHandler {
@Override
public void processRow(ResultSet rs) throws SQLException {
//Save each row sequentially.
//Do NOT call ResultSet.next() !!!!
Calendar asOf = Calendar.getInstance();
log.info("AS OF DATE: " + asOf.getTime());
Long x = (Long) rs.getLong("x");
Long xx = (Long) rs.getLong("xx");
String xxx = (String) rs.getString("xxx");
BigDecimal xxxx = (BigDecimal)rs.getBigDecimal("xxxx");
Double xxxx = (budgetAmountBD == null) ? 0.0 : budgetAmountBD.doubleValue();
BigDecimal xxxxx = (BigDecimal)rs.getBigDecimal("xxxxx");
Double xxxxx = (actualAmountBD == null) ? 0.0 : actualAmountBD.doubleValue();
dbstore(x, xx, xxx, xxxx, xxxxx, asOf);
}
}
для # 1 просто делает отборное * на столе, так и с нет сортировки индекс не собирается помогать для # 2 смены DBS не вариант – ControlAltDel
Memmory кэш не нужно от вас изменить дб – alexey28
Для реализации кэша памяти у вас будет некоторая Служба с ленивой инициализацией коллекции (если вы просто выберите без какого-либо порядка/порядка). Инициируйте эту коллекцию с результатом запроса при первом запуске, а для других вызовов просто установите результат из памяти. – alexey28