Почему отложенная загрузка в моей таблице такая медленная в режиме редактирования?

У меня есть таблица с 15 столбцами и всего около 4000 строк. Мне нужно сделать некоторые столбцы редактируемыми, поэтому я использую для этого TableFieldFactory.

Проблема в том, что когда я перехожу в режим редактирования, все загружается ОЧЕНЬ медленно. Когда я прокручиваю вниз и ленивая загрузка загружает другой буфер, может пройти до 20 секунд, прежде чем таблица будет перерисована.

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

@Override
public Field<?> createField(Container container, Object itemId, Object propertyId, com.vaadin.ui.Component uiContext) {

    TextField tField = (TextField) DefaultFieldFactory.get().createField(container, itemId, propertyId, uiContext);
    tField.setImmediate(true);

    if (propertyId.equals("Foo") {
        return tField;
    }
    else {
        tField.setReadOnly(true);
    }

    return tField;
}

При одной отложенной загрузке загружается около 500-1000 строк, поэтому createField() вызывается, может быть, 7500-15000 раз, но это известное ограничение Vaadin или я что-то делаю не так? Может быть, мне вообще не следует использовать TableFieldFactory, когда у меня так много столбцов?

Кто-нибудь знает, есть ли лучший способ реализовать упомянутую таблицу, не получая эти сумасшедшие времена загрузки буфера?

Заранее спасибо!


person Roger    schedule 23.09.2013    source источник


Ответы (1)


Когда вы говорите «одна редактируемая строка» - вы все еще создаете поле только для чтения (как в приведенном выше коде)?

Не надо.

Возвращает null из FieldFactory (а также для полей, отличных от «Foo»). Возвращайте поле из фабрики полей только в том случае, если вы хотите, чтобы столбец был редактируемым: если нет, верните ноль.

Существует большая разница между отсутствием поля и полем только для чтения: без поля (или фабрики полей) Vaadin просто сгенерирует очень простое <div> без слушателей или чего-то еще. Как только вы начнете иметь много компонентов в большой таблице Vaadin, вы увидите некоторое снижение производительности.

Итак - во-первых, я бы изменил вашу фабрику полей на следующую.

@Override
public Field<?> createField(Container container, Object itemId, Object propertyId, com.vaadin.ui.Component uiContext) {

 if (propertyId.equals("Foo") {
   TextField tField = (TextField) DefaultFieldFactory.get().createField(container, itemId, propertyId, uiContext);
   tField.setImmediate(true);

   return tField;
 }

 return null;
}

Если это не имеет большого значения, я бы изменил фабрику, чтобы создавать поля только для текущей выбранной строки.

person Charles Anthony    schedule 24.09.2013
comment
Извините, я имел в виду столбец, а не строку. - person Roger; 24.09.2013
comment
Я думаю, что ответ все еще остается в силе. Поле только для чтения != Поле вообще отсутствует! - person Charles Anthony; 24.09.2013
comment
Вы абсолютно правы. Я только что попробовал это, и это стало лучше, но, увы, когда я добавляю редактируемые столбцы в таблицу, рендеринг становится медленнее. Мне нужно всего 7 редактируемых столбцов в моей таблице, и два из них - DateFields. 5 столбцов TextField теперь загружаются примерно за 5 секунд на каждый буфер, что является улучшением, но для загрузки только двух столбцов DateField требуется по крайней мере то же самое, поэтому я по-прежнему загружаю не менее 10 секунд для каждого буфера, возвращая null для каждого поля, которое не редактируется. - person Roger; 24.09.2013
comment
Таким образом, последующий вопрос будет таким: я выдвигаю конверт сейчас для того, что разумно ожидать от таблицы Vaadin с точки зрения производительности, как я реализовал вещи? Если да, то ваш ответ полностью верен! - person Roger; 24.09.2013
comment
Я сам - я бы генерировал поля только для одной строки за раз (т.е. для выбранной строки), как в моем вчерашнем примере. С вашими 500-1000 строками на ленивую загрузку вы все еще говорите, что 7x500 (или 1000) = 3500-7000 полей одновременно присоединяются к DOM. Это слишком много, чтобы быть эффективным. - person Charles Anthony; 24.09.2013
comment
Конечно. У меня не было времени посмотреть на вашу реализацию git для другой проблемы. Теперь так очевидно, что вы упомянули нулевой возврат. По какой-то причине я зациклился на том, что таблица должна возвращать поле. Загрузка теперь значительно быстрее, даже с 7 редактируемыми столбцами. На самом деле я могу редактировать не менее 20 строк одновременно, не слишком беспокоясь о процессе загрузки! Почему мне приходится редактировать более одной строки за раз — это другой вопрос, связанный с образом работы пользователей. Большое спасибо, Чарльз! - person Roger; 24.09.2013