阿里Java開發手冊學習筆記(二)----異常日誌、MySql規約
阿新 • • 發佈:2018-12-12
一、異常處理
- 不捕獲Java類庫中定義的繼承自RuntimeException的執行時異常類。此類異常應由程式設計師預檢查規避。
- 異常不要用來做流程控制,效率太低。
- 對非穩定程式碼的catch儘可能區分異常型別,再做對應的異常處理。
- 捕獲了異常應該及時處理或者將之拋給方法呼叫者。最外層業務使用者必須處理異常。
- 有try塊放到了事務程式碼中,catch異常後,如需回滾事務,需要手動回滾。
- finally塊需對使用的資源進行關閉與釋放。
- 方法的返回值可以為空時,需要註明什麼時候返回空值。
- 防止NPE(NullPointerException),注意NPE產生的場景。
- 對外開放的介面使用錯誤碼,應用內部使用異常。跨應用RPC呼叫優先使用Result方式,封裝isSuccess,錯誤碼,錯誤資訊。
二、日誌規約
- 應用中不可以直接使用日誌系統(Log4j,Logback)中的API,而應該依賴使用的日誌框架SLF4J中的API,使用門面模式的日誌框架,有利於維護各個類日誌處理方式的同一。
- 日誌檔案推薦至少儲存15天。有些異常有以周為頻次的發生特點。
- 應用中擴充套件日誌的命名方式:
appName_logType_logName.log
推薦分類有stats/desc/monitor/visit
等。 - 對於trace/debug/info級別的日誌輸出,必須使用條件輸出形式或者佔位符方式,避免系統資源浪費。
- 異常資訊包含兩類:a.現場資訊(物件toString) b.異常堆疊資訊。
三、建表規約
- 表達是與否概念欄位時使用is_xxx方式命名,型別為unsigned tinyint。
- 表名欄位名必須使用小寫字母或數字;禁止數字開頭,禁止兩個下劃線之間只出現數字。表名不使用複數形式。
- 唯一索引名為uk_欄位名,普通索引名為idx_欄位名。
- 小數型別為decimal,不使用float和double。存在精度損失。
- 儲存字串長度基本相等時使用CHAR定長字串型別。
- varchar為可變長字串型別,不預先分配空間,長度不超過5000,否則應該獨立一張表,使用TEXT型別,用主鍵對應。
- 三個必備欄位,
id(unsigned bigint)、gmt\_create(date\_time)、gmt\_modified(date\_time)
。 - 單錶行數超過500w行時或者單表容量超過2G時,才推薦進行分庫分表。
四、索引規約
- 業務上具有唯一特性的欄位,即使是組合欄位,也要建成唯一索引。
- 超過3個表禁止join。需要join的欄位,資料型別保持一致,多表關聯查詢時,保證被關聯的欄位需要有索引。
- 在varchar欄位上建立索引時,指定索引長度。
- 頁面搜尋嚴禁左模糊或者全模糊。
- 利用覆蓋索引進行查詢操作,避免回表操作。
- 利用延遲關聯或子查詢優化超多分頁情況。
- 建立組合索引時,區分度高的在左邊。
五、SQL規約
- 不要使用count列名或者常量來取代count(*)。
- count(col)不計算此列資料為NULL的記錄,但是返回0。sum(col)返回null。
- 使用ISNULL()判斷是否為NULL值,NULL與任何值直接比較都為NULL。
- 外來鍵與級聯更新只適合單機低併發,高併發叢集影響效率。因而不使用外來鍵與級聯,外來鍵概念在應用層解決。
- 禁止使用儲存過程,因為難以除錯與擴充套件,沒有移植性。
- IDB資料訂正時,刪除修改時,要先select,避免誤刪。
- 儘量避免in操作,實在要用控制in後集合元素數量在1000以內。
- 不建議在開發中使用truncate table,儘管速度快於delete。它無事物不觸發trigger,可能造成事故。
六、ORM規約
- 表查詢時,一律不要使用*作為查詢欄位列表,以免增加解析成本、刪減欄位與resultMap配置不一。
- POJO類boolean欄位不加is,資料庫欄位則要加is_字首。
- 更新資料表記錄時同時更新gmt_modified欄位為當前時間。
- 不要寫大而全的資料更新介面,即傳入POJO物件,對錶的每個欄位都進行更新。這樣容易出錯且效率低。