ASP.NET Core Web API 入門教學 - DbContext取得資料庫資料時注意事項


Posted by TalllKai on 2021-05-13

影片講解(有字幕):


這篇要來講一個觀念,為什麼會特別想提,因為發現很多人都會犯這個錯誤,不管是新手,或者是有能力寫出一個網站的程式設計師,都還是常常看到這個錯誤。

不過我覺得這個坑,是微軟的GridView.RowDataBound害的,因為太直覺就會讓人這樣寫。
首先我們看到這個網站高雄市政府全球資訊網-機關網站

會發現要讀2秒以上,這時可能會覺得沒什麼,甚至開發的人也大概不覺得有什麼問題,因為才2秒還是能接受的範圍。

但仔細回頭想想,大家也可以自己進去看看,這頁既沒有龐大的資訊,也沒任何的邏輯運算,為什麼要花2秒才能讀取出來?

剛好在網路上有看到有人問到了今天想講的問題,Gridview 的 RowDataBound 事件程式改寫

此篇中很快就有大神直接點出問題,就是今天要講的可能會犯的錯,就是你不該將跟資料庫取值的程式放在GridView.RowDataBound事件裡面,為什麼會說是坑呢?其實GridView.RowDataBound就是個Foreach每個欄位,但用成事件就會覺得不像是在Foreach裡面,進而犯下這個錯誤。

那可能新手也不知道為什麼不要放在Foreach裡面,主要原因就是你跟資料庫存取資料會有IO傳輸時間,雖然一次的時間可能只要0.01秒,但如果你放在1000個的Foreach裡面,就可能要10秒才能結束,這就是今天要講的重要問題點.

高雄市政府全球資訊網-機關網站,這個網站應該就是使用GridView.RowDataBound事件,然後一個一個重複讀取資料庫去把單位資料撈出來,預估大概兩三百個單位吧?懶得仔細算,所以就需要2秒多才能完成。

那要怎麼解決這個問題呢?很簡單,就先把全部資料先撈回來,然後再去重複讀取撈回來的資料取值,因為是在記憶體裡面操作,所以速度會大幅提升。

但這樣做也是會有個陷阱在裡面,就是當你的資料量太大(萬筆)的時候,你就不能把它全部撈回來,不然你伺服器的記憶體一下就會被吃光,所以這兩者之間的平衡可以在設計時自己衡量一下。

ㄟ?那GridView.RowDataBound跟我們Webapi的關係是什麼?其實我只是借用這個例子想告訴大家說,當有類似需求的時候,也千萬不要在Foreach裡面去讀取資料庫。

想看整個實際操作可以看影片

新手分享學習成果,若有錯誤,煩請告知修正,感謝🙏










Related Posts

[06] JavaScript 入門 - 拉升、嚴格模式

[06] JavaScript 入門 - 拉升、嚴格模式

簡易部署 AWS EC2 遠端主機 + Ubuntu LAMP 環境 + phpmyadmin +FileZilla上傳檔案 +遇到問題

簡易部署 AWS EC2 遠端主機 + Ubuntu LAMP 環境 + phpmyadmin +FileZilla上傳檔案 +遇到問題

一看就懂的 React Server Rendering(Isomorphic JavaScript)入門教學

一看就懂的 React Server Rendering(Isomorphic JavaScript)入門教學


Comments