java - 并发请求的 repo 类线程安全吗? - Spring Boot

标签 java spring-boot spring-mvc

我正在为一个 Web 应用程序使用带有 Jetty 嵌入式 Web 服务器的 Spring Boot。 我想 100% 确定 repo 类是线程安全的。

repo 类

@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;
  }

以及从存储库调用 getRegistrationGroups 方法的服务类。

@Service
public class RegistrationService {

  @Autowired
  private Provider<RegistrationGroupRepository> registrationGroupRepository;

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

}

如果两个或多个请求执行 getRegistrationGroups(1) 方法,是否会出现竞争条件情况? 我想我是出于安全考虑,因为我正在使用带有原型(prototype) bean 的方法注入(inject)(提供程序),并且每次我都从调用中获取新实例?

最佳答案

首先,使您的 Bean 成为原型(prototype) Bean 并不能确保为每个方法调用(或每次使用,无论什么)创建一个实例。

在您的情况下,由于 Provider 的使用,您在这一点上没问题。
但是我注意到您正在直接访问 getRegistrationGroups

return registrationGroupRepository.getRegistrationGroups(1);

这段代码如何编译?您应该在 Provider 实例上调用 get()

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

回答您的问题,您应该可以使用此代码。我不喜欢您在 RegistrationGroupRepositoryImpl 中维护某种状态,但这是您的选择。

我总是喜欢将我的所有字段设置为 final。如果其中一个要求我删除 final 修饰符,则设计有问题。

关于java - 并发请求的 repo 类线程安全吗? - Spring Boot ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54736253/

相关文章:

java - CPLEX 多维数组

spring-mvc - 试图忽略 Thymeleaf 布局方言中未使用的布局片段

java自定义注解,用于修改getter方法的返回值

java - Tomcat 7 - Google Oauth2 - ClassNotFoundException - Java - Eclipse

java - JMM中的执行定义

java - Vaadin Binder 中的上传组件,例如粗略编辑器

testing - 无法在 @SpringApplicationConfiguration 注释测试中从 application.yml 获取 ${server.port}

hibernate - Grails - 不要为某些请求路径打开 hibernate session

java - 如何缓存特定时间的数据 Spring Boot Rest Template

java - 如何将用户凭据传递给 WebLogic 11g 身份验证提供程序?