【发布时间】:2017-07-20 18:20:43
【问题描述】:
我一直在开发一个使用 Spring mvc + Hibernate 和 redis 进行缓存存储的多线程 Web 应用程序。我正在寻找一种将锁应用于控制器或服务的方法。
我无法使用 Hibernate 提供的锁定机制,因为它旨在应用于数据库级别。
这是一个例子:
@RestController
@RequestMapping(RestConstants.BASE_PATH + "/campaigns")
Class CampaignController {
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public ApiResponse<?> findOne(@PathVariable Integer id) {
Campaign campaign = repo.findOne(id);
return toResponse(campaign);
}
@RequestMapping(value = "", method = RequestMethod.POST)
public create(@RequestBody Campaign campaign) {
//create an campaign here
}
@RequestMapping(value = "/{id}", method = RequestMethod.PATCH)
public update(@RequestBody Campaign campaign) {
//update an campaign here
}
}
@RestController
@RequestMapping(RestConstants.BASE_PATH + "/bulkCampaigns")
Class CampaignBulkController {
@RequestMapping(value = "/upload", method = RequestMethod.POST)
public create(@RequestPart MultipartFile data) {
/*
Data contains a list of campaigns with their details,
controller will iterate through the list and create all the campaigns.
*/
}
}
在处理映射到 CampaignBulkController 中的 create 方法的请求时,无法处理对活动的所有其他写入,但允许读取。也就是说,应删除更新或创建活动/活动的请求。
有多个服务器,每个服务器都是多线程的。
我是 Spring 和 Hibernate 的新手,任何想法或建议都将不胜感激!
【问题讨论】:
-
根据您的描述,听起来数据库级别正是您想要锁定的?锁定表,其他服务必须等待表解锁才能使用它。
-
有两件事使它略有不同:1)当一个特殊请求正在处理中时,其他请求应该被丢弃,并且用户会收到一条消息,例如“无法处理您的请求,而
正在处理中,请稍后再试。2)我需要确保当有请求进来时,只有在处理特殊请求时才会丢弃它。 -
特殊请求是否与非特殊请求共享表?特殊请求是特定操作,还是常规操作,但带有一些特殊标志来指示它们需要区别对待?您应该编辑您的问题并提供一些示例,说明您可以拥有什么样的用例。
-
@Kayaman 我刚刚更新了我的问题,如果您需要更多详细信息,请告诉我。谢谢!
标签: java spring multithreading hibernate locking