Является ли класс репо безопасным для параллельных запросов?- Весенняя загрузка - PullRequest
0 голосов
/ 17 февраля 2019

Я использую Spring boot со встроенным веб-сервером Jetty для одного веб-приложения.Я хочу быть на 100% уверенным в том, что класс репо безопасен для потоков.

Класс репо

@Repository
@Scope("prototype")
public class RegistrationGroupRepositoryImpl implements RegistrationGroupRepository {

  private RegistrationGroup rg = null;
  Integer sLastregistrationTypeID = 0;
  private UserAccountRegistration uar = null;
  private List<RegistrationGroup> registrationGroup = new ArrayList<>();

  private NamedParameterJdbcTemplate jdbcTemplate;


  @Autowired
  public RegistrationGroupRepositoryImpl(DataSource dataSource) {
     this.jdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
  }

  public List<RegistrationGroup> getRegistrationGroups(Integer regId) {
    // Some logic here which is stored in stored in the instance variables and registrationGroup is returned from the method

   return this.registrationGroup;
  }

И класс Service, который вызывает метод getRegistrationGroups из репо.

@Service
public class RegistrationService {

  @Autowired
  private Provider<RegistrationGroupRepository> registrationGroupRepository;

  public List<RegistrationGroup> getRegistrationGroup() {
     return registrationGroupRepository.getRegistrationGroups(1);
  }

}

Могу ли я получить ситуацию состояния гонки, если два или более запроса выполняют метод getRegistrationGroups (1)?Я думаю, что я в безопасности, потому что я использую инъекцию метода (Provider) с прототипом bean-компонента, и каждый раз, когда я получаю новый экземпляр из вызова?

1 Ответ

0 голосов
/ 17 февраля 2019

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

В вашем случае вы 'все в порядке, благодаря использованию Provider.
Однако я заметил, что вы обращаетесь к getRegistrationGroups напрямую.

return registrationGroupRepository.getRegistrationGroups(1);

Как этот код компилируется?Вы должны позвонить get() в Provider экземпляре.

return registrationGroupRepository.get().getRegistrationGroups(1);

Отвечая на ваш вопрос, вы должны хорошо использовать этот код.Мне не нравится тот факт, что вы поддерживаете какое-то состояние внутри RegistrationGroupRepositoryImpl, но это ваш выбор.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...