爲了具有較低的同步開銷,使用一個線程局部(對於每個計算線程)建立結果批次。一旦達到一定數量的結果,將該批次排入阻塞隊列。使用ArrayBlockingQueue來支持你的持久化類,因爲你可能不希望你的內存使用變得無限。您可以讓多個數據庫寫入程序線程獲得一組結果並將它們保存到數據庫中。
class WriteBehindPersister {
ThreadLocal<List<Result>> internalBuffer;
static ArrayBlockingQueue<List<Result>> persistQueue;
static {
persistQueue = new ArrayBlockingQueue(10);
new WriteThread().start();
}
public WriteBehindPersister() {
internalBuffer = new ThreadLocal<List<Result>>();
}
public void persist(Result r) {
List<Result> localResult = internalBuffer.get();
localResult.add(r);
if (localResult.size() > max) {
persistQueue.put(new ArrayList(localResult));
localResult.clear();
}
}
class WriteThread extends Thread {
public void run() {
while (true) {
List<Result> batch = persistQueue.take();
beginTransaction();
for (Result r : batch) {
batchInsert(r);
}
endTransaction();
}
}
}
}
此外,你可以用一個執行服務(而不是單個寫線程)同時堅持多批次到數據庫,在使用一個以上的數據庫連接的權衡。如果您的驅動程序支持,請確保使用JDBC批處理API。
工作線程多頻繁吐出結果? – Justin 2010-05-11 19:50:43