Параллельные вызовы API для возврата другого объекта - PullRequest
0 голосов
/ 22 декабря 2010

У меня есть следующий сценарий

Результаты запроса:

student1  subject1  marks1
student2  subject1  marks3
...
...

Код API выглядит следующим образом

StudentObj getStudentInfo() {
    List<StudentObj> stObj = StudentDAO.getRows(); //

    for (StudentObj s : stObj) {
       //What should I write here??
    }
}

Я хочу иметь возможность возвращать строки student1, отдельно student2 в параллельных вызовах моего API.

Я использую Hibernate (к которому я относительно новичок) поверх базы данных Oracle.

Я думал о том, как заблокировать строку student1 и вернуть эту строку, но я не очень разбираюсь в блокировке в hibernate.

На стороне клиента

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)

Первый звонок должен быть в состоянии работать со студентом1, а второй параллельный звонок должен уметь работать со студентом2.

Редактировать: внесены изменения на основе комментариев. (Я не могу отредактировать запрос, и клиенты getStudentInfo не могут передать идентификатор, если это помогает).

Ответы [ 2 ]

2 голосов
/ 22 декабря 2010

Отредактировано: синхронизировать метод, сохранить итератор учеников и возвращать следующий для каждого вызова.

Iterator<StudentObj> students;

synchronized StudentObj getStudentInfo() {
    if (null == students || !students.hasNext()) {
        students = StudentDAO.getRows().iterator();
    }
    return students.next();
}
2 голосов
/ 22 декабря 2010

Посмотрите, поможет ли приведенный ниже код. Все, что вам нужно сделать, это убедиться, что для sequenceNumber назначено правильное начальное значение. Это лучшее, что я могу предоставить на основании предоставленной вами информации.

Я все еще не понимаю, почему вы упомянули спящий режим, когда вы не можете изменять запросы. Кстати, как написан ваш запрос? Я вижу, что есть возможность использовать Hibernate Filters, но вам все равно нужно где-то поддерживать 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
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...