Регистрация  |  Вход

Insert ~6000 рекордов

Зравствуйте!

Такая задача, есть страничка с контролером, и есть метод в котором получается из базы ~6000 рекордов. Нужно для них создать 6000 обектов другого типа, и вставить в базу, и если произошла ошибка, вивести ее на страницу. Вставка должна быть так, что если какойто из рекордов зафейлился, должно все откатится(ну для етого я использую rollback). Сейчас получаю лимит CPU limit. Можно ли както решить ету проблему???

Есть идея использовать future(with CPU Limit X3), он будет делать дмл операцию, и создавать чтото типа лог файла, а страница после нажатия на кнопку, будет каждие 10 секунд пулить на существование етого обекта, и как нашло, то витягнуть из него результат. Но мне кажется что ето не очень хорошая идея.

Зравствуйте!

Такая задача, есть страничка с контролером, и есть метод в котором получается из базы ~6000 рекордов. Нужно для них создать 6000 обектов другого типа, и вставить в базу, и если произошла ошибка, вивести ее на страницу. Вставка должна быть так, что если какойто из рекордов зафейлился, должно все откатится(ну для етого я использую rollback). Сейчас получаю лимит CPU limit. Можно ли както решить ету проблему???

Есть идея использовать future(with CPU Limit X3), он будет делать дмл операцию, и создавать чтото типа лог файла, а страница после нажатия на кнопку, будет каждие 10 секунд пулить на существование етого обекта, и как нашло, то витягнуть из него результат. Но мне кажется что ето не очень хорошая идея.

Для таких случаев надо использовать batch

Для таких случаев надо использовать batch

Alex Tsitsura
Вставка должна быть так, что если какойто из рекордов зафейлился, должно все откатится

Это требование вообще непонятно, но если так, то в batch сделать переменную в которую заносить результаты каждого execute. Если хотябы в одном будет excenption (который отлавливать) то в finish методе выкашивать все только что созданные записи.

[quote="Alex Tsitsura"]Вставка должна быть так, что если какойто из рекордов зафейлился, должно все откатится[/quote]
Это требование вообще непонятно, но если так, то в batch сделать переменную в которую заносить результаты каждого execute. Если хотябы в одном будет excenption (который отлавливать) то в finish методе выкашивать все только что созданные записи.

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


P.S. сегодня столкнулся столько раз из лимитами разными что просто ужас. Например, вот в SOQL запросе нельзя написать OFFSET [число > 2000].

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


P.S. сегодня столкнулся столько раз из лимитами разными что просто ужас. Например, вот в SOQL запросе нельзя написать OFFSET [число > 2000]. 



Alex Tsitsura
решил сделать метод который будет запускаться каждые 5 сек. и брать пачку записей и делать обработку. А остановится, когда все записи обработаються.


P.S. сегодня столкнулся столько раз из лимитами разными что просто ужас. Например, вот в SOQL запросе нельзя написать OFFSET [число > 2000].

1. В конструкторе получаем или записи или ID исходных записей. Что бы не жрало ViewState используем transient для переменной со спиской ID или записей. Ставим savepoint.

2. На странице делаем кнопку "Поехали" которая запускает метод для создания новых записей.

3. В странице используем apex:actionfunction хотя можно попробовать использовать apex:poller. Этим способом вызываем тот же самый метод что и по кнопке.

4. Реализуем метод в контроллере, который пачками делает все что тебе нужно.

5. Если что-то не получается смотрим документацию.

[quote="Alex Tsitsura"]решил сделать метод который будет запускаться каждые 5 сек. и брать пачку записей и делать обработку. А остановится, когда все записи обработаються.


P.S. сегодня столкнулся столько раз из лимитами разными что просто ужас. Например, вот в SOQL запросе нельзя написать OFFSET [число > 2000].[/quote]

1. В конструкторе получаем или записи или ID исходных записей. Что бы не жрало ViewState используем transient для переменной со спиской ID или записей. Ставим savepoint.

2. На странице делаем кнопку "Поехали" которая запускает метод для создания новых записей.

3. В странице используем apex:actionfunction хотя можно попробовать использовать apex:poller. Этим способом вызываем тот же самый метод что и по кнопке.

4. Реализуем метод в контроллере, который пачками делает все что тебе нужно.

5. Если что-то не получается смотрим документацию.

wilder
1. В конструкторе получаем или записи или ID исходных записей. Что бы не жрало ViewState используем transient для переменной со спиской ID или записей. Ставим savepoint.

Возможно я что-то не понял, но как правильно использовать transient?
Сейчас попробовал так, сделаk transient set< ид >, в контролере заполнил етот сет, но когда нажымаю на кнопку "Поехали", етот сет null. У нас же, насколько я понимаю, transient указивает но то, что переменая несохраняется в контролере. И получается что и она не попадает во вю стейт. Но когда ми снова обращаемся к конролеру то переменая уже пустая. Со save point тоже ничего не получилось по етой же причине.

[quote="wilder"]1. В конструкторе получаем или записи или ID исходных записей. Что бы не жрало ViewState используем transient для переменной со спиской ID или записей. Ставим savepoint.[/quote]

Возможно я что-то не понял, но как правильно использовать transient?
Сейчас попробовал так, сделаk transient set< ид >, в контролере заполнил етот сет, но когда нажымаю на кнопку "Поехали", етот сет null. У нас же, насколько я понимаю, transient указивает но то, что переменая несохраняется в контролере. И получается что и она не попадает во вю стейт. Но когда ми снова обращаемся к конролеру то переменая уже пустая. Со save point тоже ничего не получилось по етой же причине.


Alex Tsitsura
wilder
1. В конструкторе получаем или записи или ID исходных записей. Что бы не жрало ViewState используем transient для переменной со спиской ID или записей. Ставим savepoint.

Возможно я что-то не понял, но как правильно использовать transient?
Сейчас попробовал так, сделаk transient set< ид >, в контролере заполнил етот сет, но когда нажымаю на кнопку "Поехали", етот сет null. У нас же, насколько я понимаю, transient указивает но то, что переменая несохраняется в контролере. И получается что и она не попадает во вю стейт. Но когда ми снова обращаемся к конролеру то переменая уже пустая. Со save point тоже ничего не получилось по етой же причине.

Сорри это я попутал. В этом случае transient не нужен.

А savepoint что не так ?

Лучше покажи код контроллера быстрей будет.

З.Ы. У меня похожая техника работает не с DB, а с callouts.

[quote="Alex Tsitsura"][quote="wilder"]1. В конструкторе получаем или записи или ID исходных записей. Что бы не жрало ViewState используем transient для переменной со спиской ID или записей. Ставим savepoint.[/quote]

Возможно я что-то не понял, но как правильно использовать transient?
Сейчас попробовал так, сделаk transient set< ид >, в контролере заполнил етот сет, но когда нажымаю на кнопку "Поехали", етот сет null. У нас же, насколько я понимаю, transient указивает но то, что переменая несохраняется в контролере. И получается что и она не попадает во вю стейт. Но когда ми снова обращаемся к конролеру то переменая уже пустая. Со save point тоже ничего не получилось по етой же причине.[/quote]

Сорри это я попутал. В этом случае transient не нужен.

А savepoint что не так ?

Лучше покажи код контроллера быстрей будет.

З.Ы. У меня похожая техника работает не с DB, а с callouts.

Как я понял savepoint нужно использовать только в сочетании с transient, так как savepoint не может сереализоватся. А потому мы его не можем в контролере установить, а потом использовать в методе, который вызывается из страницы.

Как я понял savepoint нужно использовать только в сочетании с transient, так как savepoint не может сереализоватся. А потому мы его не можем в контролере установить, а потом использовать в методе, который вызывается из страницы.

Что-то ты вообще "бессмыслицу" какую-то написал.

Transient нужен чтобы весь твой лист не попал во view state и страница не упала по лимитам 135kb. А 6000 записей ее точно положат. Конечно по вызову метода в переменной transient ничего не будет - в этом ее смысл, потому что ее нет во view state.
Wilder хотел тебе сказать чтобы ты передал все свои 6000 записей на страницу в javascript. В самом javascript разбивал их на пачки и отправлял в метов в виде String параметра. В методе по этой переменной опять восстанавливать пачку данных и уже работать с ней.
Если это вызывает затруднение (а этот метод уже из высшей лиги), то смотри в сторону batch - тоже самое только делается по научному и по Salesforce style так сказать.

Что-то ты вообще "бессмыслицу" какую-то написал.

Transient нужен чтобы весь твой лист не попал во view state и страница не упала по лимитам 135kb. А 6000 записей ее точно положат. Конечно по вызову метода в переменной transient ничего не будет - в этом ее смысл, потому что ее нет во view state. 
Wilder хотел тебе сказать чтобы ты передал все свои 6000 записей на страницу в javascript. В самом javascript разбивал их на пачки и отправлял в метов в виде String параметра. В методе по этой переменной опять восстанавливать пачку данных и уже работать с ней.
Если это вызывает затруднение (а этот метод уже из высшей лиги), то смотри в сторону batch - тоже самое только делается по научному и по Salesforce style так сказать.

Если проблему правильно понял - самое простое stateful batch. Объявляешь Set айдишек, кидаешь туда резалты инсертов. На финише проверяешь статусы чанков. Если есть фэйлы - удаляешь всё что в сэте.

Если проблему правильно понял - самое простое stateful batch. Объявляешь Set айдишек, кидаешь туда резалты инсертов. На финише проверяешь статусы чанков. Если есть фэйлы - удаляешь всё что в сэте.

Всем спасибо за помощь. Сделал в результате без SavePoint, так что никаких ролбеков нет, зафейлилось, то таки быть, нет - то хорошо. В контролере получаю список ид. Написал метод который делит список ид на пачки по 200 штук, и метод который берет пачку и делает соответсвующую логику. И этот метод вызывается со страницы(actionPoller) каждые 5 сек. В результате страница обработала 10 000 записей, вю стейт был только 50 Kb, так что думаю 20 000 записей тоже должно выдержать. Весь процесс создания записей занял 20 мин., в результате чего создалось 20 000+ записей.

Всем спасибо за помощь. Сделал в результате без SavePoint, так что никаких ролбеков нет, зафейлилось, то таки быть, нет - то хорошо. В контролере получаю список ид. Написал метод который делит список ид на пачки по 200 штук, и метод который берет пачку и делает соответсвующую логику. И этот метод вызывается со страницы(actionPoller) каждые 5 сек. В результате страница обработала 10 000 записей, вю стейт был только 50 Kb, так что думаю 20 000 записей тоже должно выдержать. Весь процесс создания записей занял 20 мин., в результате чего создалось 20 000+ записей.