簡體   English   中英

並發調用API以返回不同的對象

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

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