2010-01-18 2 views
2

Я использую Spring Batch для системы, которая выполняет много пакетных операций.
Я использую SimpleJobRepository с памятью DAO.
Я хотел бы знать, есть ли способ избежать использования JobRepository? что-то похожее на нерегулярного менеджера транзакций?
Причина, по которой я спрашиваю, заключается в том, что система должна работать постоянно без перезагрузки, и у меня есть некоторые проблемы с памятью, которую он будет потреблять.
Я знаю, что могу использовать базу данных JobRepositry, но, честно говоря, мне это действительно не нужно.Spring Batch resourceless JobRepository

Если нет способа сделать это, я буду признателен, если кто-то может успокоить меня по поводу проблемы с потреблением памяти.

Спасибо.

ответ

3

Вы должны использовать репозиторий заданий, поскольку он содержит информацию о контексте работы. решение для вашего дела - сделать свой репозиторий вакансий с помощью scope = "prototype" . Это приведет к новому вводу dao (реализация карты) для каждого задания и, следовательно, к проблеме с памятью. Накладные расходы на создание нового экземпляра каждый раз бессмысленны с точки зрения пакетных заданий.

+0

+1 Спасибо - и принятый ответ. –

+0

Я пробовал этот подход безрезультатно. Он продолжает бросать IllegalStateExceptions, потому что выполнение задания не сохраняется (поскольку новый репозиторий пуст). Также попробовали с прототипом JobLauncher и JobRepository получить те же результаты. – ElderMael

1

Реализация встроенной памяти имеет большой недостаток: вы не можете использовать многопоточность в своих партиях.

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

Это очень хорошо работает с Hibernate.

Преимущество этого метода над Беном состоит в том, что вы можете подключиться к вашей базе данных памяти, чтобы проверить состояния заданий (и дату запуска и т. Д.).

+0

Мне действительно не нужно проверять статусы работы и т. Д. ». Если вы можете уточнить, почему многопоточность является проблемой при использовании хранилища заданий в памяти, это будет здорово. Во всяком случае, я хочу уменьшить использование памяти, поэтому в БД памяти это не отличный вариант для меня. –

+0

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

+3

С новейшей версией реализация In-Memory теперь потокобезопасна :) –

1

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

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