2012-08-30 1 views
0

Я работаю с сессией без гражданства для пакетной работы в проекте Play Framework 1.2.4.Спящий режим Без гражданства Лучший способ обработки ошибок?

Я вставляю и обновляю строки неплохо, но я не знаю, что делать, когда произошло исключение. Heres мой код:

try{ 
     statelesssession.insert(someobject); 
    } 
catch(ConstraintViolationException e) //It happens from time to time dont ask me why.. 
    { 
     ??????transaction.rollback();????? THATS MY CONCERN 
    } 
finally{ 
     transaction.commit(); 
    } 

Что я должен знать, я имею в совершении данных на каждые 100 вставок. Я задаюсь вопросом, если ограничение на случай нарушения происходит в 56-й записи, а транзакция делает откат, я потеряю и другие 55 записей?

если да, то что мне делать в случае ограничения ограничений? или я должен совершить в каждой 1 записи, чтобы избежать этого?

+1

Я думаю, вы должны задать этот вопрос своему клиенту, а не здесь .. но если вы откатитесь на 56-й записи, не совершая **, вы потеряете ** предыдущие изменения до последнего фиксации. – mericano1

+0

Танки, я не был уверен, что он просто откатывает соответствующие данные или всю партию. – dreampowder

+0

У меня также есть другой вопрос, когда я получаю исключение, я думаю, что boject все еще сохраняется в памяти, потому что мое использование памяти становится все выше и выше, пока оно не выходит из памяти. как я могу стереть эти данные из памяти при возникновении исключения? – dreampowder

ответ

0

Если вы зафиксируете каждые 100 вставок, откат после 56-й вставки также отменяет все 55 вставок раньше.

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

Решение использует точки сохранения.

Установка точки сохранения относительно быстро. Это можно сделать после каждой вставки. Установка точки сохранения не записывает никаких данных в базу данных - вам все равно придется совершать позже, но откат выполняется только до последней точки сохранения.

Итак, в вашем примере вы фиксируете каждые 100 (или любых) строк (и после последней строки наверняка), и вы устанавливаете точку сохранения после каждой строки. Когда появляется ошибка и вы откатываете действие, только ошибочная вставка отменяется, остальные не касаются.

Описание см., Например, java.sql.Connection.setSavepoint, java.sql.Savepoint или here.

+0

звучит неплохо! благодаря! – dreampowder

1

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

1

В этом случае используйте другое задание, которое вырезает все ваши данные на 100 объектов и запустит подзадачу для этих объектов.

Лучшее, что можно сделать в этом случае для меня - это выбросить исключение. Затем основное задание получает это исключение, и все ваши 100 объектов являются откатом. Затем мастер-задание может перейти в другой режим для этого объекта и перезапустить подзадачу на объект. Тогда только тот, который выбрасывает исключение, не будет сохранен.

Это типичная обработка партии. Если все в порядке, ваша партия выполняется быстро, потому что вы совершаете каждые 100 объектов, но в случае ошибки вы возвращаетесь к фиксации одного объекта, чтобы просто не сохранять объекты, которые терпят неудачу.

Но, как сказал mericano1, правильное поведение в вашем случае является вопросом бизнес-правила.

+0

поэтому есть и другие проблемы. Когда возникает исключение, использование памяти java.exe увеличивается (я думаю, что Java сохраняет объект в памяти). Каков наилучший способ переработать эти данные при возникновении исключения? – dreampowder

+1

, поскольку у вас нет ссылки на объект, gc сделает это автоматически. Чтобы проверить использование Java-памяти, не отслеживайте ее с помощью системных инструментов, но используйте специальные инструменты, такие как visualvm для отслеживания эволюции использования кучи. –

Смежные вопросы