2012-05-18 39 views
0

我有一個方法,從文件中讀取值(讀取方法),並從數據訪問對象(DAO)類中將這些值存儲到數據庫(存儲方法)中調用另一個方法。我的問題是:我應該將讀取方法中讀取的所有值作爲列表傳遞給存儲方法(這可以節省數百個方法調用,但需要在存儲器中的列表中通過讀取方法迭代創建列表方法),還是應該爲每個值(這意味着數百個方法調用,但不需要列表創建和迭代)分別調用存儲方法。哪種方法從性能和良好實踐觀點來看效率更高?哪個更有效率,一個方法調用每個值的值列表或多個調用?

回答

0

你有多個值,所以有人必須遍歷值。唯一的問題是:誰?一般來說:只要你談論數據庫訪問(讀寫)分配列表的開銷,迭代它並做一些方法調用就可以忽略的開銷一個數據庫調用(我們討論數百的通話,而不是數十億,對不對?)。數據庫調用在大多數情況下都是類似於遠程過程調用,寫入數據庫將寫入磁盤 - 這是另一個偉大的性能吸取器。

因此,在大多數情況下,如果最大限度地減少對數據庫的調用,您將獲得性能。如果DB訪問層知道完成作業,那麼這可以更容易地完成。所以如果你給DAO一個列表,它可以執行諸如準備好的語句,批量更新等等。只有零零碎碎,這些事情不可能取得良好的表現。

0

您應該立即閱讀所有這些文件,並將其作爲List,並使用類似JDBC批量更新的方式一次或分批存儲它們。

但是,一個接一個地做它們肯定是一個不行的。它會造成太多的網絡/ IO操作。

0

要確定的唯一方法是定時各種選項。但是,由於您在此過程中正在打擊數據庫,因此可能會佔主導地位。減少數據庫訪問的變體可能是最快的。如果兩種變體對數據庫有相同的影響,那麼我希望他們花費相似的時間。調用方法和創建對象的速度要比與數據庫進行通信快幾個數量級。

0

訪問硬盤是最大的開銷。如果可以,請從硬盤讀取一次。如果沒有,請讀入緩衝區並在完成後重新填充。這個操作適用於線程,試試看。

0

數據庫資源有限,爲了獲得更好的性能,應儘量減少數據庫命中。

如果比較數據庫命中和在列表上運行的成本,則可以忽略不計。

因此,創建一個列表並嘗試執行批處理操作,而不是對每個記錄執行一個操作。

減少數據庫交互總是一個很好的做法,也是高性能的選項。

0

要回答關於良好實踐的問題,您必須考慮跨應用程序使用DAO方法。如果你看到它被多次調用來自單一原點的多個值,那麼我認爲你應該將一個List傳遞給該方法。但是如果你有更多的情況只有一個值調用方法,那麼你應該按照這個粒度來定義它。

其他人對DB訪問的看法仍然存在。嘗試批量多個數據庫訪問,如果這是可能的在你的情況。

相關問題