Как мне вставить много объектов в Play! Работа? - PullRequest
4 голосов
/ 16 июня 2011

В моем приложении мне нужно моделировать различные ситуации для анализа.Таким образом, вставьте (очень) большое количество строк в базу данных.(Мы говорим об очень большом количестве данных ... несколько миллиардов)

Модель

@Entity
public class Case extends Model {

    public String url;
}

Работа

public class Simulator extends Job {

    public void doJob() {

         for (int i = 0; i !=) {

             // Somestuff

             new Case(someString).save();
         }
    }
}

Через полчаса в базе данных еще ничего нет .Но следы отладки показывают, что Play вставляет некоторые вещи.Я подозреваю, что это какой-то кеш.

Я пробовал обо всем:

Model.em().flush();

Ничего не меняется.

Model.em().getTransaction().commit();

throws TransactionRequiredException произошло: транзакция не выполняется

Model.em().setFlushMode(FlushModeType.COMMIT);
Model.em().setFlushMode(FlushModeType.AUTO);

Ничего не меняется.

Я также пробовал @ NoTransaction аннотации везде:

  • Класс и функции в контроллере
  • Класс Case
  • Превосходящий метод сохранения в Model
  • Класс и функции моей работы

Становится довольно отчаянным.Любые советы приветствуются.

РЕДАКТИРОВАТЬ: После небольшого исследования, первая строка появляется в базе данных.Соответствующий идентификатор составляет около 550.000.Это означает, что около полумиллиона строк находятся где-то между моим приложением и базой данных.

Ответы [ 3 ]

3 голосов
/ 16 июня 2011

Попробуйте

em.getTransaction().begin();
em.persist(model);
em.getTransaction().commit();

Вы не можете совершить транзакцию до ее начала.

0 голосов
/ 17 июня 2011

Вам нужно проинструктировать Play! когда он должен выполнить вашу работу, аннотируя ваш класс одной из этих аннотаций @OnApplicationStart, @Every или @ On.

Пожалуйста, проверьте Play! документация по заданиям

0 голосов
/ 16 июня 2011

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

for (int i = 0; i !=) {

  // Somestuff

  Case tmp = new Case(someString);
  tmp = JPA.em().merge(tmp);
  tmp.save();
}

Идея состоит в том, что вы добавляете вновь созданный объект в EntityManager перед сохранением, гарантируя, что объект является частью "грязных объектов", которые будут сохранены.

...