[英]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.