我有一個方法,從文件中讀取值(讀取方法),並從數據訪問對象(DAO)類中將這些值存儲到數據庫(存儲方法)中調用另一個方法。我的問題是:我應該將讀取方法中讀取的所有值作爲列表傳遞給存儲方法(這可以節省數百個方法調用,但需要在存儲器中的列表中通過讀取方法迭代創建列表方法),還是應該爲每個值(這意味着數百個方法調用,但不需要列表創建和迭代)分別調用存儲方法。哪種方法從性能和良好實踐觀點來看效率更高?哪個更有效率,一個方法調用每個值的值列表或多個調用?
回答
你有多個值,所以有人必須遍歷值。唯一的問題是:誰?一般來說:只要你談論數據庫訪問(讀寫)分配列表的開銷,迭代它並做一些方法調用就可以忽略的開銷一個數據庫調用(我們討論數百的通話,而不是數十億,對不對?)。數據庫調用在大多數情況下都是類似於遠程過程調用,寫入數據庫將寫入磁盤 - 這是另一個偉大的性能吸取器。
因此,在大多數情況下,如果最大限度地減少對數據庫的調用,您將獲得性能。如果DB訪問層知道完成作業,那麼這可以更容易地完成。所以如果你給DAO一個列表,它可以執行諸如準備好的語句,批量更新等等。只有零零碎碎,這些事情不可能取得良好的表現。
您應該立即閱讀所有這些文件,並將其作爲List
,並使用類似JDBC批量更新的方式一次或分批存儲它們。
但是,一個接一個地做它們肯定是一個不行的。它會造成太多的網絡/ IO操作。
要確定的唯一方法是定時各種選項。但是,由於您在此過程中正在打擊數據庫,因此可能會佔主導地位。減少數據庫訪問的變體可能是最快的。如果兩種變體對數據庫有相同的影響,那麼我希望他們花費相似的時間。調用方法和創建對象的速度要比與數據庫進行通信快幾個數量級。
訪問硬盤是最大的開銷。如果可以,請從硬盤讀取一次。如果沒有,請讀入緩衝區並在完成後重新填充。這個操作適用於線程,試試看。
數據庫資源有限,爲了獲得更好的性能,應儘量減少數據庫命中。
如果比較數據庫命中和在列表上運行的成本,則可以忽略不計。
因此,創建一個列表並嘗試執行批處理操作,而不是對每個記錄執行一個操作。
減少數據庫交互總是一個很好的做法,也是高性能的選項。
要回答關於良好實踐的問題,您必須考慮跨應用程序使用DAO方法。如果你看到它被多次調用來自單一原點的多個值,那麼我認爲你應該將一個List傳遞給該方法。但是如果你有更多的情況只有一個值調用方法,那麼你應該按照這個粒度來定義它。
其他人對DB訪問的看法仍然存在。嘗試批量多個數據庫訪問,如果這是可能的在你的情況。
- 1. 哪一個更有效率的一個文檔表或多個文檔表
- 2. PHPUnit每個值調用的assert方法
- 3. 緩存一個值或調用函數 - 哪個更好?
- 4. 調用一個方法,每5秒返回一個值C#
- 5. MYSQL多個查詢或單個查詢 - 哪個更有效率
- 6. 哪個redis方法更好:多次調用HSET或者調用HMSET一次?
- 7. Python多繼承 - 調用一個類的方法,但哪一個?
- 8. 值分配給多個變量..調用一個方法
- 9. 調用列中每個值的過程?
- 10. 聲納:調用方法(一個或多個)僅有條件
- 11. 調用每個調用的方法
- 12. 哪一個更有效率:2個單表查詢或1個連接查詢
- 13. 有限列的多個表或有多列的單個表?哪個更好?
- 14. 每個線程或每個方法的堆棧調用?
- 15. 哪個使用Linq Any()更有效率?
- 16. SQL Server通過另一個表調整列中的每個值
- 17. 調用方法,哪個更好?
- 18. 使用反射調用一個方法並返回一個值
- 19. 哪個更有效率的調用 - > goto&fun($ val)或者fun($ val)在perl中?
- 20. 把一個指針作爲一個值的方法調用[python]
- 21. 多次調用一個方法,是否有更高效的方法呢?
- 22. 哪一個更有記憶效率?
- 23. 更新列值在多個表的多個值的總和,對於每一行
- 24. 最佳限制方法調用率,一個方法的頻率可以調用
- 25. 使用獨立值更新多個記錄的有效方法?
- 26. 使用一個或多個SharePoint列表同步一個SharePoint列表的方法
- 27. 哪種更高效:多個MySQL表或一個大表?
- 28. 每個頻率值帶有一個條的直方圖
- 29. 哪個更有效率:Netty的HashedWheelTimer還是Quartz的調度器?
- 30. 調用多個默認值