Java 对API的并发调用以返回不同的对象
我有下面的场景 查询结果:Java 对API的并发调用以返回不同的对象,java,hibernate,Java,Hibernate,我有下面的场景 查询结果: student1 subject1 marks1 student2 subject1 marks3 ... ... API代码如下所示 StudentObj getStudentInfo() { List<StudentObj> stObj = StudentDAO.getRows(); // for (StudentObj s : stObj) { //What should I write here??
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起作用
编辑:根据注释进行更改。(我无法编辑查询,如果有帮助,客户端getStudentInfo无法传递id)。查看下面的代码是否有帮助。这里您需要做的就是确保sequenceNumber被分配了一个正确的起始值。根据你提供的信息,这是我能提供的最好的了 我仍然不明白为什么在无法修改查询时提到hibernate。顺便问一下,您的查询是如何编写的?我认为有可能使用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
}
}
}
class-SomeClass
{
私有最终静态AtomicLong sequenceNumber=新的AtomicLong(0);
公共静态长next()
{
返回sequenceNumber.getAndIncrement();
}
StudentObj getStudentInfo()
{
List stObj=StudentDAO.getRows()//
对于(StudentObj s:stObj)
{
长过滤器=下一个();
//使用筛选器发送适当的学生信息
}
}
}
查看下面的代码是否有帮助。这里您需要做的就是确保sequenceNumber被分配了一个正确的起始值。根据你提供的信息,这是我能提供的最好的了
我仍然不明白为什么在无法修改查询时提到hibernate。顺便问一下,您的查询是如何编写的?我认为有可能使用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
}
}
}
class-SomeClass
{
私有最终静态AtomicLong sequenceNumber=新的AtomicLong(0);
公共静态长next()
{
返回sequenceNumber.getAndIncrement();
}
StudentObj getStudentInfo()
{
List stObj=StudentDAO.getRows()//
对于(StudentObj s:stObj)
{
长过滤器=下一个();
//使用筛选器发送适当的学生信息
}
}
}
编辑:同步方法,保留学生迭代器,并为每次调用返回下一个迭代器
Iterator<StudentObj> students;
synchronized StudentObj getStudentInfo() {
if (null == students || !students.hasNext()) {
students = StudentDAO.getRows().iterator();
}
return students.next();
}
Iterator学生;
同步的StudentObj getStudentInfo(){
if(null==students | |!students.hasNext()){
students=StudentDAO.getRows().iterator();
}
返回学生。下一步();
}
编辑:同步方法,保留学生迭代器,并为每次调用返回下一个迭代器
Iterator<StudentObj> students;
synchronized StudentObj getStudentInfo() {
if (null == students || !students.hasNext()) {
students = StudentDAO.getRows().iterator();
}
return students.next();
}
Iterator学生;
同步的StudentObj getStudentInfo(){
if(null==students | |!students.hasNext()){
students=StudentDAO.getRows().iterator();
}
返回学生。下一步();
}
你是在问如何在hibernate中使用过滤器吗?不是,但我应该如何使用锁(如果正确的话)将不同的学生对象返回给API的客户端。显然,我可能误解了你的问题。您能提供更多详细信息吗?查询返回如上所示的结果,包括学生、科目和相应的分数。让我们调用API getStudentInfo(),如果调用getStudentInfo,那么它应该在student1行上运行,而同时,如果调用getStudentInfo,那么它应该能够在student2上运行。请告诉我,如果此帮助仅在发出并发请求时才提供,则它应返回“student2”数据,否则(如果没有并发请求,则它应返回“student1”数据?您是否询问如何将筛选器与hibernate一起使用?否,但我应如何使用锁(如果正确)将不同的学生对象返回给API的客户端。显然,我可能误解了您的问题。您能提供更多详细信息吗?查询返回如上所示的结果,包括学生、科目和相应的分数。让我们调用API getStudentInfo(),如果调用getStudentInfo,则它应该在student1行上运行,而如果同时调用getStudentInfo,则它应该能够在student2上运行。请告诉我,这是否有帮助仅当发出并发请求时,它应该返回“student2”数据,否则(如果没有并发请求,则应该返回)“student1”数据?问题是方法签名不能更改,因为它意味着客户端代码的更改问题是方法签名不能更改,因为它意味着客户端代码的更改