1. 程式人生 > >阿里Java開發手冊學習筆記(二)----異常日誌、MySql規約

阿里Java開發手冊學習筆記(二)----異常日誌、MySql規約

一、異常處理

  1. 不捕獲Java類庫中定義的繼承自RuntimeException的執行時異常類。此類異常應由程式設計師預檢查規避。
  2. 異常不要用來做流程控制,效率太低。
  3. 對非穩定程式碼的catch儘可能區分異常型別,再做對應的異常處理。
  4. 捕獲了異常應該及時處理或者將之拋給方法呼叫者。最外層業務使用者必須處理異常。
  5. 有try塊放到了事務程式碼中,catch異常後,如需回滾事務,需要手動回滾。
  6. finally塊需對使用的資源進行關閉與釋放。
  7. 方法的返回值可以為空時,需要註明什麼時候返回空值。
  8. 防止NPE(NullPointerException),注意NPE產生的場景。
  9. 對外開放的介面使用錯誤碼,應用內部使用異常。跨應用RPC呼叫優先使用Result方式,封裝isSuccess,錯誤碼,錯誤資訊。

二、日誌規約

  1. 應用中不可以直接使用日誌系統(Log4j,Logback)中的API,而應該依賴使用的日誌框架SLF4J中的API,使用門面模式的日誌框架,有利於維護各個類日誌處理方式的同一。
  2. 日誌檔案推薦至少儲存15天。有些異常有以周為頻次的發生特點。
  3. 應用中擴充套件日誌的命名方式:appName_logType_logName.log 推薦分類有stats/desc/monitor/visit等。
  4. 對於trace/debug/info級別的日誌輸出,必須使用條件輸出形式或者佔位符方式,避免系統資源浪費。
  5. 異常資訊包含兩類:a.現場資訊(物件toString) b.異常堆疊資訊。

三、建表規約

  1. 表達是與否概念欄位時使用is_xxx方式命名,型別為unsigned tinyint。
  2. 表名欄位名必須使用小寫字母或數字;禁止數字開頭,禁止兩個下劃線之間只出現數字。表名不使用複數形式。
  3. 唯一索引名為uk_欄位名,普通索引名為idx_欄位名。
  4. 小數型別為decimal,不使用float和double。存在精度損失。
  5. 儲存字串長度基本相等時使用CHAR定長字串型別。
  6. varchar為可變長字串型別,不預先分配空間,長度不超過5000,否則應該獨立一張表,使用TEXT型別,用主鍵對應。
  7. 三個必備欄位,id(unsigned bigint)、gmt\_create(date\_time)、gmt\_modified(date\_time)
  8. 單錶行數超過500w行時或者單表容量超過2G時,才推薦進行分庫分表。

四、索引規約

  1. 業務上具有唯一特性的欄位,即使是組合欄位,也要建成唯一索引。
  2. 超過3個表禁止join。需要join的欄位,資料型別保持一致,多表關聯查詢時,保證被關聯的欄位需要有索引。
  3. 在varchar欄位上建立索引時,指定索引長度。
  4. 頁面搜尋嚴禁左模糊或者全模糊。
  5. 利用覆蓋索引進行查詢操作,避免回表操作。
  6. 利用延遲關聯或子查詢優化超多分頁情況。
  7. 建立組合索引時,區分度高的在左邊。

五、SQL規約

  1. 不要使用count列名或者常量來取代count(*)。
  2. count(col)不計算此列資料為NULL的記錄,但是返回0。sum(col)返回null。
  3. 使用ISNULL()判斷是否為NULL值,NULL與任何值直接比較都為NULL。
  4. 外來鍵與級聯更新只適合單機低併發,高併發叢集影響效率。因而不使用外來鍵與級聯,外來鍵概念在應用層解決。
  5. 禁止使用儲存過程,因為難以除錯與擴充套件,沒有移植性。
  6. IDB資料訂正時,刪除修改時,要先select,避免誤刪。
  7. 儘量避免in操作,實在要用控制in後集合元素數量在1000以內。
  8. 不建議在開發中使用truncate table,儘管速度快於delete。它無事物不觸發trigger,可能造成事故。

六、ORM規約

  1. 表查詢時,一律不要使用*作為查詢欄位列表,以免增加解析成本、刪減欄位與resultMap配置不一。
  2. POJO類boolean欄位不加is,資料庫欄位則要加is_字首。
  3. 更新資料表記錄時同時更新gmt_modified欄位為當前時間。
  4. 不要寫大而全的資料更新介面,即傳入POJO物件,對錶的每個欄位都進行更新。這樣容易出錯且效率低。