溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Java個(gè)人技術(shù)知識(shí)點(diǎn)總結(jié)(優(yōu)化篇)

發(fā)布時(shí)間:2020-08-10 23:33:37 來(lái)源:ITPUB博客 閱讀:103 作者:Java知音 欄目:編程語(yǔ)言

代碼優(yōu)化 

代碼結(jié)構(gòu)層次的優(yōu)化(目的:更加方便代碼的維護(hù)--可維護(hù)性,可讀性)

        1.代碼注釋(代碼規(guī)范)

        2.工具類(lèi)的封裝(方便代碼的維護(hù),使代碼結(jié)構(gòu)更加清晰不臃腫,保證團(tuán)隊(duì)里代碼       質(zhì)量一致性)

        3.公共部分的提取

代碼性能的優(yōu)化(目的:使程序的性能最優(yōu)化)

        1.使用一些性能比較高的類(lèi)(bufferInputStream)

        2.緩沖區(qū)塊的大小(4k或者8k)

        3.公共部分的提取

        4.通常要用stringbuffer替代string加號(hào)拼接

業(yè)務(wù)優(yōu)化

  我們做項(xiàng)目的時(shí)候業(yè)務(wù)優(yōu)化這方面最主要是從用戶(hù)體驗(yàn)度角度進(jìn)行考慮,減少用戶(hù)操       作的步驟提高工作效率,通常有以下幾種:

  1.可以通過(guò)tabindex屬性來(lái)改變tab鍵盤(pán)的操作順序

  2.可以通過(guò)回車(chē)鍵來(lái)進(jìn)行搜索或者提交操作

  3.對(duì)于單選按鈕和復(fù)選按鈕可以通過(guò)操作后面的文本來(lái)選擇前面的單選按鈕以及復(fù)選        按鈕

  4.添加的信息要按照id倒序進(jìn)行排列

  5.進(jìn)行搜索操作時(shí)加入js loading操作(不僅告訴用戶(hù)所進(jìn)行的請(qǐng)求正在被處理,而       且防止用戶(hù)多次點(diǎn)擊提交操作)

  6.當(dāng)進(jìn)行刪除操作的時(shí)候要彈出提示框,警告用戶(hù)要進(jìn)行刪除操作,是否確認(rèn)。

  7.根據(jù)returnURL在用戶(hù)登錄成功后直接跳到想要訪(fǎng)問(wèn)的資源。

  8.進(jìn)行刪除操作時(shí)通過(guò)confirm提示用戶(hù)是否確認(rèn)刪除操作,操作完后提示操作是否       成功。

  9.減少用戶(hù)操作的步驟

      10.使用autocomplete插件快速進(jìn)行搜索

 必背,必做:

    1.可以通過(guò)回車(chē)鍵來(lái)進(jìn)行搜索或者提交操作

  2.添加的信息要按照id倒序進(jìn)行排列

  3.進(jìn)行搜索操作時(shí)加入js loading操作(不僅告訴用戶(hù)所進(jìn)行的請(qǐng)求正在被處理,而且防止用戶(hù)多次點(diǎn)擊提交操作)

  4.當(dāng)進(jìn)行刪除操作的時(shí)候要彈出提示框,警告用戶(hù)要進(jìn)行刪除操作,是否確認(rèn),如果刪除成功則彈出提示框告訴用戶(hù)。

  5.減少用戶(hù)操作的步驟

       6.通過(guò)ztree,以及kindeiditor來(lái)提高用戶(hù)的體驗(yàn)度

sql優(yōu)化

  1、SELECT子句中避免使用 *, 盡量應(yīng)該根據(jù)業(yè)務(wù)需求按字段進(jìn)行查詢(xún)

  2、盡量多使用COMMIT如對(duì)大數(shù)據(jù)量的分段批量提交釋放了資源,減輕了服務(wù)器壓力

  3、在寫(xiě)sql語(yǔ)句的話(huà),盡量保持每次查詢(xún)的sql語(yǔ)句字段用大寫(xiě),因?yàn)閛racle總是先解析      sql語(yǔ)句,把小寫(xiě)的字母轉(zhuǎn)換成大寫(xiě)的再執(zhí)行

  4、用UNION-ALL 替換UNION,因?yàn)閁NION-ALL不會(huì)過(guò)濾重復(fù)數(shù)據(jù),所執(zhí)行效率        要快于UNION,并且UNION可以自動(dòng)排序,而UNION-ALL不會(huì)

  5、避免在索引列上使用計(jì)算和函數(shù),這樣索引就不能使用

Sql優(yōu)化精簡(jiǎn)版:

1.(重點(diǎn))(必須說(shuō)) SELECT語(yǔ)句中避免使用 *,盡量應(yīng)該根據(jù)業(yè)務(wù)需求按字段進(jìn)行查詢(xún)

舉例:如果表中有個(gè)字段用的是clob或者是blob這種大數(shù)據(jù)字段的話(huà),他們的查詢(xún)應(yīng)該根據(jù)業(yè)務(wù)需要來(lái)進(jìn)行指定字段的查詢(xún),切記勿直接用*

2.(重點(diǎn)) 刪除重復(fù)記錄(oracle):

最高效的刪除重復(fù)記錄方法(因?yàn)槭褂昧薘OWID)例子:

DELETE  FROM  EMP E  WHERE  E.ROWID > 

(SELECT MIN(X.ROWID)

FROM  EMP X  WHERE  X.EMP_NO = E.EMP_NO);

3.用>=替換>

如一個(gè)表有100萬(wàn)記錄,一個(gè)數(shù)值型字段A,

A=0時(shí),有30萬(wàn)條;

A=1時(shí),有30萬(wàn)條;

A=2時(shí),有39萬(wàn)條;

A=3時(shí),有1萬(wàn)記錄。

那么執(zhí)行A>2與 A>=3 的效果就有很大的區(qū)別了,因?yàn)?A>2 時(shí),ORACLE會(huì)先找出為2的記錄索引再進(jìn)行比較,而A>=3時(shí)ORACLE則直接找到=3的記錄索引。

4.(重點(diǎn))盡量多使用COMMIT如對(duì)大數(shù)據(jù)量的分段批量提交

5. (重點(diǎn))用NOT EXISTS 或(外連接+判斷為空)方案 替換 NOT IN操作符此操作是強(qiáng)列推薦不使用的,因?yàn)樗荒軕?yīng)用表的索引。推薦方案:用NOT EXISTS或(外連接+判斷為空)方案代替

6.(重點(diǎn) 必須說(shuō))LIKE操作符(大數(shù)據(jù)的全文檢索使用luncene)(solr)因?yàn)槭褂胠ike不當(dāng),會(huì)導(dǎo)致性能問(wèn)題,原因是like在左右兩邊都有%的時(shí)候,不會(huì)使用索引。

如LIKE '%5400%'這種查詢(xún)不會(huì)引用索引,而LIKE 'X5400%'則會(huì)引用范圍索引。

一個(gè)實(shí)際例子:

查詢(xún)營(yíng)業(yè)編號(hào)YY_BH LIKE '%5400%'這個(gè)條件會(huì)產(chǎn)生全表掃描,如果改成YY_BH LIKE 'X5400%' OR YY_BH LIKE 'B5400%'則會(huì)利用YY_BH的索引進(jìn)行兩個(gè)范圍的查詢(xún),性能肯定大大提高。

7.(重點(diǎn),必須說(shuō))避免在索引列上使用計(jì)算和函數(shù),這樣索引就不能使用

舉例:

低效:

SELECT… FROM  DEPT  WHERE SAL * 12 > 25000;

高效:

SELECT… FROM DEPT WHERE SAL > 25000/12;

8.(重點(diǎn) 必須說(shuō))用UNION-ALL 替換UNION,

因?yàn)閁NION-ALL不會(huì)過(guò)濾重復(fù)數(shù)據(jù)而且不會(huì)自動(dòng)排序,所執(zhí)行效率要快于UNION。

9.(優(yōu)化,重點(diǎn),3個(gè)方面 a.緩存 b.分段批量 c.存儲(chǔ)過(guò)程)減少訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)的次數(shù)

舉例:如果批量刪除多條數(shù)據(jù),可以用  delete  from tableName where id

 in (1,2,3)

而不要用多條delete語(yǔ)句進(jìn)行刪除

10.(重點(diǎn) 必須說(shuō))用TRUNCATE替代DELETE

TRUNCATE不記錄日志,DELETE記錄日志,所以TRUNCATE要快于DELETE但是一旦用TRUNCATE進(jìn)行刪除就不能進(jìn)行恢復(fù),TRUNCATE是刪除整張表的數(shù)據(jù)不能加where條件。

==================================================================

mysql,sqlserver中如果

id為自增類(lèi)型,那么如果用TRUNCATE刪除,則id字段再插入數(shù)據(jù)時(shí)從1開(kāi)始,如果delete刪除的話(huà),則從刪除之前的id的值繼續(xù)增長(zhǎng)。

防sql注入

針對(duì)防sql注入,我們通常是這樣做的:

首先在前臺(tái)頁(yè)面對(duì)用戶(hù)輸入信息進(jìn)行js驗(yàn)證,對(duì)一些特殊字符進(jìn)行屏蔽,比如:or ,單引號(hào),--,= ,還有就是限制用戶(hù)名輸入的長(zhǎng)度,我們一般將其限制在6---13位。另外,對(duì)于用戶(hù)的敏感信息我們進(jìn)行Md5加密,還有,為了增加用戶(hù)體驗(yàn)度和用戶(hù)友好度,為了不使用戶(hù)看到一些詳細(xì)的異常信息我們會(huì)進(jìn)行錯(cuò)誤信息頁(yè)面的定制,像404,500錯(cuò)誤。另一個(gè)我層面講,這樣做也是為了保護(hù)我們的一些重要信息。此外,我們會(huì)給特定的人分配定定的權(quán)限,而不是給其分配管理員權(quán)限!

  sql注入

所謂SQL注入,就是通過(guò)一些含有特殊字符的sql語(yǔ)句發(fā)送到服務(wù)器欺騙服務(wù)器并進(jìn)行攻擊。(特殊字符:or, 單引號(hào),--,空格)

  Sql注入的 防護(hù)

1.永遠(yuǎn)不要信任用戶(hù)的輸入。對(duì)用戶(hù)的輸入進(jìn)行校驗(yàn),可以通過(guò)正則表達(dá)式(js正則或者java后臺(tái)正則),或限制長(zhǎng)度;對(duì)單引號(hào)和雙"-"進(jìn)行轉(zhuǎn)換等。

2.永遠(yuǎn)不要使用動(dòng)態(tài)拼裝sql,使用參數(shù)化的sql。(永遠(yuǎn)不要使用+號(hào)拼接sql字符串,而是使用?傳參的方式進(jìn)行)

3.不要給用戶(hù)太高的權(quán)限而根據(jù)需求進(jìn)行賦權(quán)

4.對(duì)敏感信息進(jìn)行加密 如md5(單向加密不可逆轉(zhuǎn))。

5.自定義錯(cuò)誤頁(yè)面。目的是為了不把我們的程序的bug暴露在別有用心的人的面前。而去不會(huì)讓用戶(hù)看到報(bào)錯(cuò)的頁(yè)面,也提高了用戶(hù)的體驗(yàn)度。

SQL注入防范

使用參數(shù)化的過(guò)濾性語(yǔ)句  要防御SQL注入,用戶(hù)的輸入就絕對(duì)不能直接被嵌入到SQL語(yǔ)句中。恰恰相反,用戶(hù)的輸入必須進(jìn)行過(guò)濾,或者使用參數(shù)化的語(yǔ)句。參數(shù)化的語(yǔ)句使用參數(shù)而不是將用戶(hù)輸入嵌入到語(yǔ)句中。在多數(shù)情況中,SQL語(yǔ)句就得以修正。然后,用戶(hù)輸入就被限于一個(gè)參數(shù)。

輸入驗(yàn)證

  檢查用戶(hù)輸入的合法性,確信輸入的內(nèi)容只包含合法的數(shù)據(jù)。數(shù)據(jù)檢查應(yīng)當(dāng)在客戶(hù)端和服務(wù)器端(java代碼)都執(zhí)行之所以要執(zhí)行服務(wù)器端驗(yàn)證,是為了彌補(bǔ)客戶(hù)端驗(yàn)證機(jī)制脆弱的安全性。  在客戶(hù)端,攻擊者完全有可能獲得網(wǎng)頁(yè)的源代碼,修改驗(yàn)證合法性的腳本(或者直接刪除腳本),然后將非法內(nèi)容通過(guò)修改后的表單提交給服務(wù)器。因此,要保證驗(yàn)證操作確實(shí)已經(jīng)執(zhí)行,唯一的辦法就是在服務(wù)器端也執(zhí)行驗(yàn)證。你可以使用許多內(nèi)建的驗(yàn)證對(duì)象,例如Regular Expression Validator,它們能夠自動(dòng)生成驗(yàn)證用的客戶(hù)端腳本,當(dāng)然你也可以插入服務(wù)器端的方法調(diào)用。如果找不到現(xiàn)成的驗(yàn)證對(duì)象,你可以通過(guò)Custom Validator自己創(chuàng)建一個(gè)。

錯(cuò)誤消息處理

  防范SQL注入,還要避免出現(xiàn)一些詳細(xì)的錯(cuò)誤消息,因?yàn)楹诳蛡兛梢岳眠@些消息。要使用一種標(biāo)準(zhǔn)的輸入確認(rèn)機(jī)制來(lái)驗(yàn)證所有的輸入數(shù)據(jù)的長(zhǎng)度、類(lèi)型、語(yǔ)句、企業(yè)規(guī)則等。

加密處理

將用戶(hù)登錄名稱(chēng)、密碼等數(shù)據(jù)加密保存。加密用戶(hù)輸入的數(shù)據(jù),然后再將它與數(shù)據(jù)庫(kù)中保存的數(shù)據(jù)比較,這相當(dāng)于對(duì)用戶(hù)輸入的數(shù)據(jù)進(jìn)行了“消毒”處理,用戶(hù)輸入的數(shù)據(jù)不再對(duì)數(shù)據(jù)庫(kù)有任何特殊的意義,從而也就防止了攻擊者注入SQL命令。

存儲(chǔ)過(guò)程來(lái)執(zhí)行所有的查詢(xún)

  SQL參數(shù)的傳遞方式將防止攻擊者利用單引號(hào)和連字符實(shí)施攻擊。此外,它還使得數(shù)據(jù)庫(kù)權(quán)限可以限制到只允許特定的存儲(chǔ)過(guò)程執(zhí)行,所有的用戶(hù)輸入必須遵從被調(diào)用的存儲(chǔ)過(guò)程的安全上下文,這樣就很難再發(fā)生注入式攻擊了。

使用專(zhuān)業(yè)的漏洞掃描工具

  攻擊者們目前正在自動(dòng)搜索攻擊目標(biāo)并實(shí)施攻擊,其技術(shù)甚至可以輕易地被應(yīng)用于其它的Web架構(gòu)中的漏洞。企業(yè)應(yīng)當(dāng)投資于一些專(zhuān)業(yè)的漏洞掃描工具,如大名鼎鼎的Acunetix的Web漏洞掃描程序等。一個(gè)完善的漏洞掃描程序不同于網(wǎng)絡(luò)掃描程序,它專(zhuān)門(mén)查找網(wǎng)站上的SQL注入式漏洞。最新的漏洞掃描程序可以查找最新發(fā)現(xiàn)的漏洞。

確保數(shù)據(jù)庫(kù)安全

  鎖定你的數(shù)據(jù)庫(kù)的安全,只給訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)的web應(yīng)用功能所需的最低的權(quán)限,撤銷(xiāo)不必要的公共許可,使用強(qiáng)大的加密技術(shù)來(lái)保護(hù)敏感數(shù)據(jù)并維護(hù)審查跟蹤。如果web應(yīng)用不需要訪(fǎng)問(wèn)某些表,那么確認(rèn)它沒(méi)有訪(fǎng)問(wèn)這些表的權(quán)限。如果web應(yīng)用只需要只讀的權(quán)限,那么就禁止它對(duì)此表的 drop 、insert、update、delete 的權(quán)限,并確保數(shù)據(jù)庫(kù)打了最新補(bǔ)丁。

安全審評(píng)

在部署應(yīng)用系統(tǒng)前,始終要做安全審評(píng)。建立一個(gè)正式的安全過(guò)程,并且每次做更新時(shí),要對(duì)所有的編碼做審評(píng)。開(kāi)發(fā)隊(duì)伍在正式上線(xiàn)前會(huì)做很詳細(xì)的安全審評(píng),然后在幾周或幾個(gè)月之后他們做一些很小的更新時(shí),他們會(huì)跳過(guò)安全審評(píng)這關(guān),“就是一個(gè)小小的更新,我們以后再做編碼審評(píng)好了”。請(qǐng)始終堅(jiān)持做安全審評(píng)。

數(shù)據(jù)庫(kù)中常用術(shù)語(yǔ):

ddl:數(shù)據(jù)定義語(yǔ)言 Create Drop Alter

dml:數(shù)據(jù)操縱語(yǔ)言 insert update delete select

dcl:數(shù)據(jù)控制語(yǔ)言 grant revoke

tcl:事務(wù)控制語(yǔ)言 commit rollback


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI