有效率的利用資源

減少記憶體、CPU運算、網路傳輸的浪費

不提早獲得資源

在程式進入點,直接獲取之後邏輯判斷所需要用的資源,但並非所有判斷都會使用到,未使用到的資源就變成浪費,造成系統額外的負擔。

範例比較

在3個IF 判斷邏輯,皆僅有一半會往下處理,進行1千次運算的情形下 提早獲得資源的程度需執行 45023 ms , PreLoader.java 不提早獲得資源的程式需執行 17026 ms , NonPreLoader.java 兩者相差約2.6倍的速度

不應該取得用不到的資料

取得資料表大量資料,但僅使用到一小部分 很多時候您不是故意取得大量資料,只是不了解某些Framework、Library的運作原理

ORM、DAO 的分頁方式

1. 邏輯分頁

取回所有資料,透過JDBC 游標的方式進行分頁處理後回傳資料

2. 物理分頁

使用資料庫的 SQL分頁語法,取得相對應的資料

加快共用資源釋放

Connection Pool

當連線並發數量 大於 Pool Size時,會出現越來越多的連線請求在等待的狀況 連線等待太久則會出現Timeout 的情形

如果你的某些應用沒有Timeout的機制,或者Timeout設的太長 這時你的系統就會出現完全無法運作的狀況 因為你的程式一直卡在等待取得Connection的狀態

每個程式的佔用Connection時間越短,就能提高Connection的利用率 原有的程式就能夠承載較高的並發數量

DataBase Transaction

很多人用Transaction是為了避免髒資料的產生,但大部分的應用僅需要對一筆資料進行修改,這時使用Transaction反而變成一種浪費。

這邊提供一個非常不好的使用情境 你的程式會同時更新同一筆資料,而且長時間佔住Connection,並且從頭到尾都使用Transaction

這個時候兩個Thread 修改了同一筆資料,但在未Commit前,兩個Thread跟DB拿的資料是未修改前的 較慢送出 Commit 的程式將會出現DeadLock

看不清圖檔,請用此連結

Last updated