CQRS批量操作的效能問題

thinkjava發表於2013-01-03

假設Book是一個聚合實體,現在要刪除某一個Book沒有問題,通過倉儲Repository載入實體,然後呼叫其delete方法即可,但現在問題來了,如果DB中有上萬個Book需要一次性批量全部刪除,那麼應該如何設計呢,看下面的程式碼:

       @[author]CommandHandler[/author]
	public void handle(RemoveAllBookCommand command, UnitOfWork unitOfWork) {
		List<BookEntry> entrys = bookRepository.findAllBooks();
		if (entrys != null || !entrys.isEmpty()) {
			for (BookEntry entry : entrys) {
				Book book = (Book) this.repository.load(new StringAggregateIdentifier(entry
								.getIdentifier()));
				book.delete();//刪除Book
			}
		}
	}
<p>

這種設計有兩個缺點:

1. 脫了褲子放屁,還不如直接呼叫bookRepository.deleteAllBooks()

2. 效能降低,獲取所有的Data Book,然後呼叫實體中的delete方法

3. 分頁刪除,如果有100萬Book需要全部清零,那麼一定需要分多次呼叫findBooks獲得資料實體,這會嚴重影響效能

各位版友有何建議?

相關文章