Массовая загрузка контента и создание страницы в Sitecore

У меня есть процесс, в котором я получаю набор результатов xml, из которого я могу обрабатывать данные и программно создавать страницы в Sitecore. Это просто, если у нас есть несколько страниц, которые даже один раз. Теперь моя проблема в том, что я должен создавать минимум 50 тысяч страниц в Sitecore два раза в день из xml. Таким образом, загрузка такого большого количества данных в sitecore один раз - очень медленный процесс. Есть ли оптимальный способ создания этих страниц в Sitecore.

Я использую Sitecore 7.

процесс создания страницы

using (new Sitecore.SecurityModel.SecurityDisabler())
{
    for (int i = 0; i < item.count; i++)
    {
        Item newCityItem = parentCityItem.Add("Page_" + i, template1);
        newCityItem.Editing.BeginEdit();
        try
        {
            newCityItem.Fields["html"].Value = mPages[i].ToString();
            newCityItem.Editing.EndEdit();
        }
        catch (System.Exception ex)
        {     
            // The update failed, write a message to the log    
            Sitecore.Diagnostics.Log.Error("Could not update item " + newCityItem.Paths.FullPath + ": " + ex.Message, this);
            // Cancel the edit (not really needed, as Sitecore automatically aborts     // the transaction on exceptions, but it wont hurt your code)    
            newCityItem.Editing.CancelEdit();
        }
    }
}

Любая помощь ...


person Sam    schedule 29.01.2014    source источник
comment
Вы загружаете 50 тысяч новых страниц каждый день, или некоторые из них являются новыми и обновляют некоторые существующие? Есть ли в вашем xml временные метки, чтобы можно было проверить, когда контент был обновлен в последний раз?   -  person jammykam    schedule 29.01.2014
comment
Эти страницы будут новыми каждый день, а затем я удаляю страницы предыдущего дня, поскольку я обновляю новые страницы.   -  person Sam    schedule 29.01.2014
comment
@jammykam я могу управлять процессом переноса xml в db. Как только у меня будут данные в БД, то лучше всего будет ежедневно генерировать такое количество страниц.   -  person Sam    schedule 29.01.2014


Ответы (4)


Оберните свой цикл в BulkUpdateContext, который отключает события, индексы и т. д.

using(new BulkUpdateContext())
{
   // code here
}
person Mark Ursino    schedule 30.01.2014

Я не думаю, что это еще один способ создания элементов Sitecore.

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

person Community    schedule 29.01.2014

Если эти элементы заменяются в Sitecore два раза в день, я предполагаю, что они не редактируются и вы используете Sitecore для уровня представления.

Если это так, вы можете сопоставить свой xml как Sitecore DataProvider. Таким образом, xml используется в качестве источника элементов, хотя они по-прежнему могут быть прочитаны в Sitecore, а уровень представления Sitecore видит их как обычные элементы sitecore.

Об этом есть запись в блоге по адресу http://blog.horizontalintegration.com/2013/03/17/an-introduction-to-sitecore-data-providers/, а также некоторую документацию в SDN.

Изменить (спасибо jammykam)

Я бы не стал сопоставлять напрямую с файлом xml - может быть, поместить его в базу данных, а затем сопоставить это с sitecore.

person Adam Hopkinson    schedule 29.01.2014
comment
Не уверен, что хотел бы читать данные на 50 тыс. страниц из XML-файлов. Я согласен, что поставщик данных - это один из способов, но я бы, вероятно, запустил процесс ETL, чтобы сбросить данные в базу данных SQL и получить оттуда поставщика данных. Хотя хороший вариант. - person jammykam; 29.01.2014
comment
Я бы тоже не стал, но хотел бы выдвинуть это как альтернативу - person Adam Hopkinson; 29.01.2014

Каждый раз, когда вы сохраняете элемент, статистика обновляется (например, измененный пользователь, дата изменения и т. д.), и все события активируются (сохранение элемента, построение индекса и т. д.). Вы можете отключить оба из них:

item.Editing.BeginEdit();
item["Title"] = "My new title";
item.Editing.EndEdit(false, true);

В зависимости от ваших требований вам может потребоваться перестроить индекс в конце импорта.

person Kevin Brechbühl    schedule 29.01.2014