????作為一名開發(fā)工程師,如何提升個人能力荤西、減少bug的發(fā)生是一件非常重要的事情,它直接關(guān)系到了領(lǐng)導(dǎo)及項(xiàng)目組對你能力的認(rèn)可。層出不窮的bug靜下心來好好歸類邪锌,無非是需求不明確勉躺、配置問題、請求參數(shù)問題觅丰、數(shù)據(jù)庫讀和寫時的并發(fā)問題饵溅、越權(quán)問題、冪等性問題妇萄,進(jìn)而導(dǎo)致了數(shù)據(jù)庫鎖表蜕企、空指針系統(tǒng)異常、內(nèi)存溢出等現(xiàn)象冠句。
????很多公司都會做代碼走查(codereview)糖赔,走查過程中更多的是相關(guān)人員憑借自身的經(jīng)驗(yàn)及公司的代碼規(guī)范制度去檢查代碼規(guī)范、代碼性能等轩端。若過程中參與人的經(jīng)驗(yàn)很豐富放典,則確實(shí)能提升代碼的質(zhì)量,減少bug和事故的發(fā)生基茵。若大家的水平都一般般奋构,走查也會趨于一種形式,bug還是會不斷的出現(xiàn)拱层。
????本人結(jié)合開發(fā)過程中的各種bug及事故情況弥臼,特總結(jié)了如下一些場景,可在代碼走查之前先行閱讀加強(qiáng)代碼質(zhì)量的意識根灯,同時作為代碼走查的checklist點(diǎn)一起排查径缅。
禁止在大循環(huán)中逐條調(diào)Service,SQL烙肺,Redis
- 關(guān)于Service的調(diào)用
服務(wù)本身:提供批量接口纳猪;
調(diào)用方:盡可能的以批量方式調(diào)用取代逐條調(diào)用,減少系統(tǒng)開銷桃笙;- 關(guān)于SQL的循環(huán)調(diào)用
主要針對查詢氏堤,盡可能的將逐條查詢轉(zhuǎn)化為一次查詢一個批次,減少與數(shù)據(jù)庫交互次數(shù)搏明。
禁止3B:Big Transaction鼠锈,Big SQL,Big Batch
Big Transaction
- 注意點(diǎn):
- 對數(shù)據(jù)庫操作必須使用事務(wù)星著,不能使用自動提交购笆,盡量使用聲明式事務(wù);
- 讓事務(wù)盡可能的小,在Service層組裝數(shù)據(jù)虚循,在manager層處理事務(wù)同欠;
- 不要在事務(wù)里調(diào)用服務(wù)(服務(wù)可能阻塞)样傍;
- 不要在事務(wù)里調(diào)用Redis;
- 在事務(wù)中批量更新要排序行您,確保多事務(wù)并發(fā)時铭乾,避免資源鎖等待。
- 詳解:
無論是Oracle娃循、SqlServer還是Mysql炕檩,大事務(wù)是一定要避免的,大事務(wù)容易造成鎖資源的長時間占用捌斧,從而降低并發(fā)性能笛质,增大死鎖概率。如下是幾種大事務(wù)的典型場景:
- @Transactional打在Class上捞蚂,這樣類中的所有方法均在事務(wù)邊界內(nèi)妇押,容易造成大事務(wù),@Transactional應(yīng)該控制更精細(xì)一些姓迅,打到方法級敲霍;
2)在一個事務(wù)中要更新多張表,在更新每一張表之前都要處理一堆業(yè)務(wù)邏輯(查詢丁存、運(yùn)算肩杈、調(diào)用服務(wù)等等),正確的做法應(yīng)該是將查詢解寝、運(yùn)算和服務(wù)調(diào)用邏輯提到事務(wù)外扩然,事務(wù)邊界內(nèi)盡可能只處理表更新操作;
Big SQL
- SQL使用:
- 盡量不用表關(guān)聯(lián)聋伦,如果使用表關(guān)聯(lián)夫偶,不要超過3個表join;
- 熱點(diǎn)數(shù)據(jù)盡量使用Redis觉增;(比如基礎(chǔ)資料)
- 盡量不用子查詢兵拢,不用Exist,不在條件列上使用函數(shù)抑片;
Big Batch
大批量的查詢輸出很容易將內(nèi)存打爆卵佛,報表或者打印要分批處理。
圖中涉及內(nèi)容鏈接:
Java的常用設(shè)計(jì)模式介紹
Hutool工具類整理官網(wǎng)
持續(xù)完善中敞斋。。疾牲。