標籤:
資料庫大欄位(Clob, Blob)不適合儲存超過1MB的資料
通常資料庫都提供Clob,Blob,Text,Long等大欄位類型來存放超過4K的資料,然而這絕不意味著應該使用大欄位來儲存超過1MB以上的資料檔案。之所以有大欄位,往往是因為varchar類型有一定的長度限制,例如4K。超過此長度的文本和位元據必須使用大欄位儲存。不過通常情況下,大欄位不意味著儲存很大的檔案,通常只是幾十到幾百KB的資料,例如很長的文章,表徵圖,小圖片等等。超過1MB以上的資料儲存在資料庫有諸多的效能問題:
速度慢
Web Server可以直接讀取硬碟檔案,然後返迴文件給用戶端,或者應用伺服器讀硬碟檔案返回用戶端,其效率要遠遠超過應用伺服器訪問資料庫讀取資料返回用戶端。
操作不方便
必須把資料庫開啟一個流,構造一個Buffer,然後再輸出一個ServletOutputStream。佔用資料庫連接,加重資料庫訪問負載不說,如果使用者突然中斷下載,還需要處理資料庫關閉動作,容易造成效能問題。如果把整個資料讀入記憶體再輸出,則記憶體佔用非常客觀。如果是硬碟檔案,只要返回一個URL就可以了。即使你不希望使用者直接存取到檔案,你也可以構造一個IOStream來輸出檔案,既不會佔用資料庫資源,傳輸速度也快。
效能有問題
特別的情況是,如果並發很多使用者來下載大檔案的時候,應用伺服器要佔用非常多的記憶體來快取檔案內容,假設並發10個使用者,下載10MB的檔案,JVM的峰值就至少需要100MB記憶體來支撐,很容易造成JVM崩潰。
Oracle其實還有一種File的Blob類型,雖然也是Blob,但是實際上File是儲存在硬碟上的,這種方式的你可以試試看,只不過我覺得這種方式還不如直接操作檔案方便,既然原理是一樣的。
另外補充一點,常規的Database Backup都是無法備份Blob資料的,所以如果你把檔案都儲存到Blob裡面去的話,資料庫的備份是一個很頭疼的大問題,你必須單獨寫程式把blob資料讀出來,再寫到硬碟檔案去,再備份檔案。而你如何把檔案放在硬碟某個目錄下面,而不是做為blob放在資料庫裡面,那備份簡直易如反掌。
當然儲存檔案的方式的缺點就是檔案不能重名,否則會覆蓋,這個問題也不難解決,一般的fileupload API碰到重名都會有很多改名儲存的策略;另外一點就是作業系統一個目錄下面可以放的檔案數量有限制,這個限制通常和檔案系統的inode數量有關係,例如一個目錄下面只能放1024個檔案之類,然而這個問題同樣可以通過file upload的一些儲存策略解決掉,例如再增加一個子目錄存放什麼的。Oracle其實還有一種File的Blob類型,雖然也是Blob,但是實際上File是儲存在硬碟上的,這種方式的你可以試試看,只不過我覺得這種方式還不如直接操作檔案方便,既然原理是一樣的。
oracle 大欄位的使用(轉)