> For the complete documentation index, see [llms.txt](https://yulinliu.gitbook.io/share/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://yulinliu.gitbook.io/share/you-xiao-lv-de-li-yong-yuan.md).

# 有效率的利用資源

## **不提早獲得資源**

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

### 範例比較

在3個IF 判斷邏輯，皆僅有一半會往下處理，進行1千次運算的情形下\
提早獲得資源的程度需執行 45023 ms , [PreLoader.java](https://github.com/yulinliu/stability/blob/master/src/main/java/io/PreLoader.java)\
不提早獲得資源的程式需執行 17026 ms , [NonPreLoader.java](https://github.com/yulinliu/stability/blob/master/src/main/java/io/NonPreLoader.java)\
兩者相差約2.6倍的速度

![提早獲得資源](/files/-LCseub4gYlFBxu2Pnv6)

![不提早獲得資源](/files/-LCsfSCt2oXhwMN2m3ZT)

## **不應該取得用不到的資料**

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

### ORM、DAO 的分頁方式

#### 1. 邏輯分頁

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

![邏輯分頁](/files/-LCx7I89RtNCy-ozko2o)

#### 2. 物理分頁

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

![物理分頁](/files/-LCx7QNPuQiVxjJ7iwRU)

## **加快共用資源釋放**

### **Connection Pool**

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

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

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

### DataBase **Transaction**

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

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

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

![Transaction Lock, DeadLock](/files/-LDapSCtkN-PKsXB1xFl)

\
[看不清圖檔，請用此連結](https://drive.google.com/open?id=14TNAJjINE0lBsWWwd_zF5iz0znzG0iLJ)
