[英]Concurrent calls to API to return different object
我有以下情況
查詢結果:
student1 subject1 marks1
student2 subject1 marks3
...
...
API代碼如下所示
StudentObj getStudentInfo() {
List<StudentObj> stObj = StudentDAO.getRows(); //
for (StudentObj s : stObj) {
//What should I write here??
}
}
我希望能夠在並發調用我的API時分別返回student1行和student2行。
我在oracle數據庫之上使用Hibernate(相對來說還是比較新的)。
我當時正在考慮鎖定student1行並返回該行,但是我對鎖定休眠狀態不是很熟悉。
在客戶端
time t1: getStudentInfo() (work on student1) | getStudentInfo() //Call concurrently (work on student2)
time t1+10sec: getStudentInfo (work on student3)
time t1+20sec: getStudentInfo (work on student4)
第一次呼叫應能夠對student1起作用,第二次並發呼叫應能對student2起作用。
編輯:根據評論進行更改。 (如果有幫助,我無法編輯查詢,並且客戶端getStudentInfo無法傳遞ID)。
查看以下代碼是否有幫助。 您需要做的就是確保為sequenceNumber分配了正確的起始值。 根據您提供的信息,這是我能提供的最好的服務。
我仍然對為什么無法修改查詢時為什么提到休眠感到困惑。 您的查詢如何寫? 我看到有使用Hibernate過濾器的潛力,但您仍然需要以某種方式維護sequenceNumber。 在不了解更多細節的情況下很難提供適當的解決方案。
class SomeClass
{
private final static AtomicLong sequenceNumber = new AtomicLong(0);
public static long next()
{
return sequenceNumber.getAndIncrement();
}
StudentObj getStudentInfo()
{
List<StudentObj> stObj = StudentDAO.getRows(); //
for (StudentObj s : stObj)
{
long filter = next();
//use filter to send the appropriate student info
}
}
}
編輯:同步該方法,並保留一個學生的迭代器,並為每個調用返回下一個。
Iterator<StudentObj> students;
synchronized StudentObj getStudentInfo() {
if (null == students || !students.hasNext()) {
students = StudentDAO.getRows().iterator();
}
return students.next();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.