簡體   English   中英

如何在彈簧啟動中使用線程安全控制器

[英]How to have thread safe controller in spring boot

我該如何創建一個線程安全的控制器?

根據最佳實踐,控制器是單身人士。

考慮下面的代碼,其中我通過自動裝配的服務對象存儲用戶數據,這使我的代碼有狀態。 我如何使下面的代碼線程安全。

@RestController
class ApiController {

    @Autowired
    IDbService< User > iDBService;

    @RequestMapping(value = "/api/adduser", method = RequestMethod.POST)
    public ResponseEntity<User> createUser(@RequestBody User user){

        User savedUser=iDBService.create(user);

        return new ResponseEntity<User>(savedUser, HttpStatus.CREATED);
    }

這是我的服務實現。 我在我的服務中共享變量

public class IDbServiceImpl<T> implements IDBService<T>{

@Autowired
GenericRepository<T, Serializable> genericRepository;

@Override
public T create(T object) {
    return  genericRepository.save(object);
}

}

默認情況下,您的控制器是單件,默認情況下您的服務也是單件。

因此,為了使它們的線程安全,您必須確保在服務內部發生的操作必須是線程安全的,以防更改服務中對象的狀態,即。 一個列表。

如果使用rdbms,那么您就遇到了與事務相關的問題。

如果您使用spring和Jpa,則事務管理器會在您使用@Transactional的情況下處理您的更新。 如果是普通的jdbc方法,那么你可以使用純jdbc並自己進行事務處理,也可以使用事務管理器附帶的spring-jdbc。

如果您希望在正在進行寫入時不更改數據庫行,則必須考慮與行鎖定相關的機制。 - gkatzioura 2月7日15:23

如果JPA使用@Transactional將完成工作。 但是,根據您的應用程序,您可能需要考慮鎖定。 檢查與JPA鎖定文章。

控制器是singletons ,因此它們應該以線程安全的方式實現。

以控制器無狀態的方式設計應用程序。 @Repository層添加事務支持。

例:

public class GenericRepository<T, Serializable> {
 @Transactional
 public void save(T object) {
  // save user
 }
}

您可以使用Spring聲明式事務管理機制。 @Transactional注釋本身定義了單個數據庫事務的范圍。

您的控制器看起來線程安全 因為沒有存儲狀態的實例變量。 每個請求的用戶對象都不同,將由MVC框架解析。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM