多線程查詢數(shù)據庫?
Excel文件中的記錄比較多的話,要考慮使用多線程。可以考慮使用多線程設計模式中的Producer-Consumer模式。首先,專門開辟一個線程(一個夠用,多了無益,以下稱之為Reader線程),該線程負責讀取Excel文件中的記錄。比如使用第三方工具POI,此時讀取到的Excel記錄是一個Java對象。該線程每次讀取到記錄都將其存入隊列(如ArrayBlockingQueue)。它僅負責讀取記錄并將其存入隊列,其它的事情它不做。其次,再設置若干個線程(如果一個夠用,就一個。數(shù)量最好不要超過系統(tǒng)的CPU個數(shù),以下稱為Processor線程),這些線程負責從上述隊列中取出記錄(對象),然后對記錄中的數(shù)據進行校驗,寫入數(shù)據庫(這里我假設導入的目標是數(shù)據庫,你的問題中并沒有說明導入目標是什么)。最后,Reader線程讀取完所以記錄之后,要“通知”Processor線程:等你處理完所有記錄后,你可以停止了。這點,可以借助多線程設計模式中的Two-phase Termination模式來實現(xiàn)。其主要思想是為要停止的線程(目標線程,這里就是Processor線程)設置一個停止標志,并設置一個表示目標線程的工作任務數(shù)(這里值有多少條記錄需要它處理)的變量。當目標線程偵測到其待處理的任務數(shù)為0,且線程停止標志已置為true的情況下,該線程就可以停止了。Two-phase Termination模式參考這里:Java多線程編程模式實戰(zhàn)指南(三):Two-phase Termination模式。更詳細的,可以參考我的新書。最后,相應注意“產品”的粒度。即Reader線程往隊列(傳輸通道)中存入的“產品”是個什么對象,是一條Excel記錄,還是多條Excel記錄?一般為了減少“產品”在隊列中的移動次數(shù)(以減少相應開銷)要適當將“產品”的粒度設置粗一些。例如,創(chuàng)建一個“容器型”對象用來存儲多條記錄。