我一直在使用Spring + 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中处理映射到创建方法的请求时,无法处理所有其他对活动的写入,但读取是allowed.That,应该删除更新或创建活动/活动的请求。
有多个服务器,每个服务器都是多线程的。
我对Spring和Hibernate很陌生,任何想法或建议都将不胜感激!
发布于 2017-07-20 19:41:33
我将在这里概述一个初步的答案,可能是为了以后的修改。
如果您使用共享的ReadWriteLock并将读锁用于常规操作,则可以让您的特权操作使用写锁来阻止常规操作。
// Regular operation tries to lock, if not successful a privileged operation is happening
if(!lock.readLock().tryLock())
return cannotProcessResponse;
performRegularOperation();
lock.readLock().unlock();// Privileged operation always waits for lock
lock.writeLock().lock();
performPrivilegedOperation();
lock.writeLock().unlock();现在,这种方法存在一些问题。如果使用单个共享锁,一次只能运行一个特权操作。如果这是一个问题,可以使用多个锁,并将它们的读锁锁在一起(这很容易导致死锁,因此必须小心)。还应考虑锁的公平性。
https://stackoverflow.com/questions/45222428
复制相似问题