Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 冬眠分页_Java_Hibernate_Pagination - Fatal编程技术网

Java 冬眠分页

Java 冬眠分页,java,hibernate,pagination,Java,Hibernate,Pagination,我有一个带有“null”或“done”标志的项目表,我需要获取带有null标志的项目,处理它们,将标志设置为done 问题是,我想使用分页,在这里我获取500乘500项(空标记) 我的设计如下 我从制作人那里拿到500件 让他们排队 一些线程将这些500个项目//发送给消费者 对其进行操作并将标志更新为“完成” 我面临的问题是,消费者的速度非常慢,因此生产商再次获取相同的500个零件,因此我尝试索引,但似乎无法正常工作 public List<Parts> getNParts(int

我有一个带有“null”或“done”标志的项目表,我需要获取带有null标志的项目,处理它们,将标志设置为done

问题是,我想使用分页,在这里我获取500乘500项(空标记) 我的设计如下

  • 我从制作人那里拿到500件
  • 让他们排队
  • 一些线程将这些500个项目//发送给消费者
  • 对其进行操作并将标志更新为“完成”
  • 我面临的问题是,消费者的速度非常慢,因此生产商再次获取相同的500个零件,因此我尝试索引,但似乎无法正常工作

    public List<Parts> getNParts(int listSize) {
            try {
    
                criteria = session.createCriteria(Parts.class);
                criteria.setFirstResult(DBIndexGuard.getNextIndex()); //index+=500;
                criteria.add(Restrictions.isNull("Status"));
    
                criteria.setMaxResults(listSize); //list size is 500;
                newPartList = criteria.list();
    
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
    
            }
    
            return newPartList;
        }
    
    public List getnpart(int-listSize){
    试一试{
    条件=session.createCriteria(Parts.class);
    criteria.setFirstResult(DBIndexGuard.getNextIndex());//索引+=500;
    标准.add(Restrictions.isNull(“Status”);
    criteria.setMaxResults(listSize);//列表大小为500;
    newPartList=criteria.list();
    }捕获(例外e){
    e、 printStackTrace();
    }最后{
    }
    返回newPartList;
    }
    

    如何实现分页以获取500×500个不同的项目,这些项目的条件为空标记?

    为生产者-消费者类型的问题创建一个同步的方法,教程可以帮助您。

    您可以尝试以下实现之一。 1.消除用户端的重复处理。仅当为null时设置为done。 2.通过在放入队列时保持附加状态“进程中”消除生产者上的重复。在生产者查询中排除它们。
    3.分页时,按表的主键对记录进行排序,对于后续页面,只查询比上一页最后一条记录的主键大的记录。

    此问题可以通过包含另一个状态(如“正在处理”)来轻松解决。因此,制作者会将选中的记录标记为-“正在处理”和consumer然后可以处理它们,并将它们的状态设置为“完成”。
    在这种情况下,制作人不会选择已经选择的记录。

    我解决了它,如下所示

      if (newPartList.isEmpty() || newPartList.size()<DBIndexGuard.getAllowedListSize()) { // AllowedListSize=500                   
        System.out.println("DataFetcher Sleeping");
        inputQueue.offer(newPartList);       
        DBIndexGuard.resetIndex();          
        session.clear();
        TimeUnit.MINUTES.sleep(10);
        }
    

    if(newPartList.isEmpty()|| newPartList.size())如果两个线程都在同一个对象上工作,则同步将起作用。但当它们通过队列通信时,同步将不起作用。@Poorna producer-问题的使用者类型是基于
    Thread
    的。其中producer是一个线程,consumer是另一个线程,并且它们使用相同的方法/对象。如果要通过队列通信,请使用
    BlockingQueue