在不同流中的批处理中执行常规指令执行

时间:2010-09-08 15:39:16

标签: java

回答这个问题需要一些银行知识:

假设我已从帐户a1-> a2和a2-> a3设置了SI 这些只是两条指令,需要批量处理。 但我希望这两条指令将在两个不同的流中处理。

这是不可能的,因为帐户a2在流1中被锁定而无法在流2中处理,直到流1完成其处理。

解决此问题的方法: 要么我在一个流中执行所有SI,要么我确定指令的依赖性,并将这些指令相应地放入流中。

或者还有其他方法可以解决这个问题。

我正在使用Java和Hibernate。

1 个答案:

答案 0 :(得分:0)

我不熟悉您问题的具体细节,但听起来很像管道CPU中的data hazards

在您的情况下,您希望最大限度地利用功能单元(流),而不会引入数据危险。也许你可以编写一个简单的调度程序,展望未来的n条指令并将它们安排到流中?

/**
 * Keeps track of which stream is scheduled to process each account.
 * If an account is not currently scheduled to be processed, it doesn't appear in the keySet of this map.
 */
Map<Account, Stream> accountsInFlight; // use a synchronized implementation

void schedule(Instruction instruction) {
  // If the input account is in flight somewhere, use that stream
  if (accountsInFlight.containsKey(instruction.getInAccount())) {
    scheduleToStream(instruction, accountsInFlight.get(instruction.getInAccount()));

  // If the output account is in flight somewhere, use that stream
  } else if (accountsInFlight.containsKey(instruction.getOutAccount())) {
    scheduleToStream(instruction, accountsInFlight.get(instruction.getOutAccount()));

  // If neither are in flight, this is a good candidate for parallel execution, 
  // put it in a different stream
  } else {
    Stream stream = // pick a stream (maybe the one with the shortest queue?)
    scheduleToStream(instruction, stream);
  }
}

private void scheduleToStream(Instruction instruction, Stream stream) {
  stream.addToQueue(instruction);
  // Update accountsInFlight
  accountsInFlight.put(instruction.getInAccount(), stream);
  accountsInFlight.put(instruction.getOutAccount(), stream);
}

// Remove accounts from the map when the instruction completes 

请注意,这都是假代码:它没有被优化,也没有正确覆盖所有情况,但也许它会给你一些开始的想法。