当前位置: 首页 > 知识库问答 >
问题:

查询表的两个线程

彭飞虎
2023-03-14

我有一个很大的表,大约1米的记录,我想对所有的记录做一些处理,所以1个线程的方式,就是说。。。1000条记录,处理它们,再获得1000条记录等等。。。但如果我想使用多任务处理呢?也就是说,两个线程分别获取1000条记录,并并行处理,如何确保每个线程将获取不同的1000条记录?注意:我正在使用hibernate

好像是这样的

public void run() {


    partList=getKParts(10);
    operateOnList(partList);


}

共有3个答案

魏成济
2023-03-14

如果数据库中的记录确实具有类型为intlong的主键,则为每个线程添加一个限制,以便仅从范围中获取记录:

Thread1: 0000 - 0999, 2000 - 2999, etc
Thread2: 1000 - 1999, 3000 - 3999, etc

这样,每个线程只需要一个偏移量、一个计数器和一个增量。例如,Thread1的偏移量为0,而Thread2的偏移量为1000。由于本例中有两个线程,因此增量为2000。对于每轮增量,计算每个线程的计数器(从0开始),并计算下一个范围:

形式=偏移量(计数*2000)到=从999

璩慎之
2023-03-14

如果我理解正确,您不希望预先获取1m记录,而是希望它以1000个为一批,然后以两个线程处理它们,但要使其并行。首先,必须在数据库查询中使用RowCount或其他方法实现分页类型特性。在Java中,您可以将fromRowCount传递到toRowCount,并在1000个批中获取记录,并在线程中并行处理它们。我在这里添加了示例代码,但您必须进一步实现不同变量的逻辑。

        int totalRecordCount = 100000;
        int batchSize =1000;
        ExecutorService executor = Executors.newFixedThreadPool(totalRecordCount/batchSize);
        for(int x=0; x < totalRecordCount;){
            int toRowCount = x+batchSize;
            partList=getKParts(10,x,toRowCount);
            x= toRowCount + 1;
            executor.submit(new Runnable<>() {
                @Override
                public void run() {
                    operateOnList(partList);
                }
            });
        }

希望这有帮助。如果需要进一步澄清,请告诉我

蒋奕
2023-03-14

当然,你可以同步代码。

public class MyClass {

    private final HibernateFetcher hibernateFetcher = new HibernateFetcher();

    private class Worker implements Runnable {    
       public run() {    
         List partList = hibernateFetcher.fetchRecords();
         operateOnList(partList);    
       }
    }

    public void myBatchProcessor() {

      while(!hibernateFetcher.isFinished()) {
      // create *n* workers and go!

      }    
   }       
}

class HibernateFetcher {        

  private int count = 0; 
  private final Object lock = new Object();
  private volatile boolean isFinished = false;  
  public List fetchRecords() {

      Criteria criteria = ...;

      synchronized(lock) {
         criteria.setFirstResult(count) // offset
                 .setMaxResults(1000);
         count=count+1000;
      }
      List result = criteria.list();
      isFinished = result.length > 0 ? false: true;
      return result;
  }

  public synchronized boolean isFinished(){
    return isFinished;
  }

}
 类似资料:
  • 问题内容: 我想知道如何用php中的两个表进行查询? 我有这个查询 但是我想将col_Autor与另一个表(tb_autores)中的au_Nombre进行比较,并从中获取au_Photo和其他值,我该怎么做? 问题答案: 通过在FROM子句中指定两个表并在where子句中建立关系,可以在不使用JOIN关键字的情况下进行简单的联接查询。 例如

  • 我有桌子: 行程:Trip_Num、Trip_Type等 用户的出差历史记录:Username、Trip_Num等 我正在用php做一个项目,需要为一个特定的用户(通过他的用户名)做一个SQL查询--需要知道用户的Trips历史表中Trip_Num的Trip_Type。 附上我的表格: 更新:我需要计算trip_type中的每个值。我的意思是我想看到“步行”-4次,“自行车”-3次,这很好?...

  • 我需要连接来自两个不同表的数据,如下所示。仅使用一个sql查询就可以做到这一点吗?如果“key”和“name”在两个表上,那么它们是相同的。表1中的“状态”始终为“-”,表2中的“T”。此外,两个表上的“名称”和“comp”都匹配(例如:Name3-C和Name4-B)<我尝试过“联合”和“加入”,但还没有解决办法! 表1 表2 结果应该是。。。 提前谢谢!

  • 我有两个表与1:1的关系,我使用内容提供者和CursorLoader。 如何使连接查询与游标加载器一起工作?我可以用内容提供程序中的rawSql来黑它,但如何在游标加载器构造函数中做就不是我能做到的了。 多谢!

  • 问题内容: 我有一个存储过程,该过程将(或应该)将记录从一个表移动到另一个表。但是,我现在想创建一个过程来对照“ TableB”中的数据检查“ TableA”中的数据 基本上,我想提取不在“ TableB”中但在“ TableA”中的任何数字,是否可以通过LEFT JOIN来做到这一点?到目前为止,我一直未能成功找到丢失的文件,并且我删除了一些文件以形成测试用例。 问题答案: 您可以使用 或:

  • 问题内容: 我正在运行此查询 但这不是我想要的结果,它返回多行。 我的一张桌子看起来像这个名字: 另一个表看起来像这个名字: 我如何使其选择查询,以便可以从两个表中获取与之相关的所有值,并使它看起来像这样 所需的输出: 谢谢!(提前!) 问题答案: 为您提供所需的输出(但这并不灵活,因此,如果添加要输出的更多详细信息,将无法进行更改而不进行更改):-