我有一个很大的表,大约1米的记录,我想对所有的记录做一些处理,所以1个线程的方式,就是说。。。1000条记录,处理它们,再获得1000条记录等等。。。但如果我想使用多任务处理呢?也就是说,两个线程分别获取1000条记录,并并行处理,如何确保每个线程将获取不同的1000条记录?注意:我正在使用hibernate
好像是这样的
public void run() {
partList=getKParts(10);
operateOnList(partList);
}
如果数据库中的记录确实具有类型为int
或long
的主键,则为每个线程添加一个限制,以便仅从范围中获取记录:
Thread1: 0000 - 0999, 2000 - 2999, etc
Thread2: 1000 - 1999, 3000 - 3999, etc
这样,每个线程只需要一个偏移量
、一个计数器
和一个增量
。例如,Thread1
的偏移量为0,而Thread2
的偏移量为1000。由于本例中有两个线程,因此增量为2000。对于每轮增量,计算每个线程的计数器(从0开始),并计算下一个范围:
形式=偏移量(计数*2000)到=从999
如果我理解正确,您不希望预先获取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);
}
});
}
希望这有帮助。如果需要进一步澄清,请告诉我
当然,你可以同步代码。
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来做到这一点?到目前为止,我一直未能成功找到丢失的文件,并且我删除了一些文件以形成测试用例。 问题答案: 您可以使用 或:
问题内容: 我正在运行此查询 但这不是我想要的结果,它返回多行。 我的一张桌子看起来像这个名字: 另一个表看起来像这个名字: 我如何使其选择查询,以便可以从两个表中获取与之相关的所有值,并使它看起来像这样 所需的输出: 谢谢!(提前!) 问题答案: 为您提供所需的输出(但这并不灵活,因此,如果添加要输出的更多详细信息,将无法进行更改而不进行更改):-