Java個人技術知識點總結(最佳化篇)

Java知音發表於2018-11-09

程式碼最佳化 

程式碼結構層次的最佳化(目的:更加方便程式碼的維護--可維護性,可讀性)

        1.程式碼註釋(程式碼規範)

        2.工具類的封裝(方便程式碼的維護,使程式碼結構更加清晰不臃腫,保證團隊裡程式碼       質量一致性)

        3.公共部分的提取

程式碼效能的最佳化(目的:使程式的效能最最佳化)

        1.使用一些效能比較高的類(bufferInputStream)

        2.緩衝區塊的大小(4k或者8k)

        3.公共部分的提取

        4.通常要用stringbuffer替代string加號拼接

業務最佳化

  我們做專案的時候業務最佳化這方面最主要是從使用者體驗度角度進行考慮,減少使用者操       作的步驟提高工作效率,通常有以下幾種:

  1.可以透過tabindex屬性來改變tab鍵盤的操作順序

  2.可以透過Enter鍵來進行搜尋或者提交操作

  3.對於單選按鈕和核取按鈕可以透過操作後面的文字來選擇前面的單選按鈕以及複選        按鈕

  4.新增的資訊要按照id倒序進行排列

  5.進行搜尋操作時加入js loading操作(不僅告訴使用者所進行的請求正在被處理,而       且防止使用者多次點選提交操作)

  6.當進行刪除操作的時候要彈出提示框,警告使用者要進行刪除操作,是否確認。

  7.根據returnURL在使用者登入成功後直接跳到想要訪問的資源。

  8.進行刪除操作時透過confirm提示使用者是否確認刪除操作,操作完後提示操作是否       成功。

  9.減少使用者操作的步驟

      10.使用autocomplete外掛快速進行搜尋

 必背,必做:

    1.可以透過Enter鍵來進行搜尋或者提交操作

  2.新增的資訊要按照id倒序進行排列

  3.進行搜尋操作時加入js loading操作(不僅告訴使用者所進行的請求正在被處理,而且防止使用者多次點選提交操作)

  4.當進行刪除操作的時候要彈出提示框,警告使用者要進行刪除操作,是否確認,如果刪除成功則彈出提示框告訴使用者。

  5.減少使用者操作的步驟

       6.透過ztree,以及kindeiditor來提高使用者的體驗度

sql最佳化

  1、SELECT子句中避免使用 *, 儘量應該根據業務需求按欄位進行查詢

  2、儘量多使用COMMIT如對大資料量的分段批次提交釋放了資源,減輕了伺服器壓力

  3、在寫sql語句的話,儘量保持每次查詢的sql語句欄位用大寫,因為oracle總是先解析      sql語句,把小寫的字母轉換成大寫的再執行

  4、用UNION-ALL 替換UNION,因為UNION-ALL不會過濾重複資料,所執行效率        要快於UNION,並且UNION可以自動排序,而UNION-ALL不會

  5、避免在索引列上使用計算和函式,這樣索引就不能使用

Sql最佳化精簡版:

1.(重點)(必須說) SELECT語句中避免使用 *,儘量應該根據業務需求按欄位進行查詢

舉例:如果表中有個欄位用的是clob或者是blob這種大資料欄位的話,他們的查詢應該根據業務需要來進行指定欄位的查詢,切記勿直接用*

2.(重點) 刪除重複記錄(oracle):

最高效的刪除重複記錄方法(因為使用了ROWID)例子:

DELETE  FROM  EMP E  WHERE  E.ROWID > 

(SELECT MIN(X.ROWID)

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

3.用>=替換>

如一個表有100萬記錄,一個數值型欄位A,

A=0時,有30萬條;

A=1時,有30萬條;

A=2時,有39萬條;

A=3時,有1萬記錄。

那麼執行A>2與 A>=3 的效果就有很大的區別了,因為 A>2 時,ORACLE會先找出為2的記錄索引再進行比較,而A>=3時ORACLE則直接找到=3的記錄索引。

4.(重點)儘量多使用COMMIT如對大資料量的分段批次提交

5. (重點)用NOT EXISTS 或(外連線+判斷為空)方案 替換 NOT IN運算子此操作是強列推薦不使用的,因為它不能應用表的索引。推薦方案:用NOT EXISTS或(外連線+判斷為空)方案代替

6.(重點 必須說)LIKE運算子(大資料的全文檢索使用luncene)(solr)因為使用like不當,會導致效能問題,原因是like在左右兩邊都有%的時候,不會使用索引。

如LIKE '%5400%'這種查詢不會引用索引,而LIKE 'X5400%'則會引用範圍索引。

一個實際例子:

查詢營業編號YY_BH LIKE '%5400%'這個條件會產生全表掃描,如果改成YY_BH LIKE 'X5400%' OR YY_BH LIKE 'B5400%'則會利用YY_BH的索引進行兩個範圍的查詢,效能肯定大大提高。

7.(重點,必須說)避免在索引列上使用計算和函式,這樣索引就不能使用

舉例:

低效:

SELECT… FROM  DEPT  WHERE SAL * 12 > 25000;

高效:

SELECT… FROM DEPT WHERE SAL > 25000/12;

8.(重點 必須說)用UNION-ALL 替換UNION,

因為UNION-ALL不會過濾重複資料而且不會自動排序,所執行效率要快於UNION。

9.(最佳化,重點,3個方面 a.快取 b.分段批次 c.儲存過程)減少訪問資料庫的次數

舉例:如果批次刪除多條資料,可以用  delete  from tableName where id

 in (1,2,3)

而不要用多條delete語句進行刪除

10.(重點 必須說)用TRUNCATE替代DELETE

TRUNCATE不記錄日誌,DELETE記錄日誌,所以TRUNCATE要快於DELETE但是一旦用TRUNCATE進行刪除就不能進行恢復,TRUNCATE是刪除整張表的資料不能加where條件。

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

mysql,sqlserver中如果

id為自增型別,那麼如果用TRUNCATE刪除,則id欄位再插入資料時從1開始,如果delete刪除的話,則從刪除之前的id的值繼續增長。

防sql注入

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

首先在前臺頁面對使用者輸入資訊進行js驗證,對一些特殊字元進行遮蔽,比如:or ,單引號,--,= ,還有就是限制使用者名稱輸入的長度,我們一般將其限制在6---13位。另外,對於使用者的敏感資訊我們進行Md5加密,還有,為了增加使用者體驗度和使用者友好度,為了不使使用者看到一些詳細的異常資訊我們會進行錯誤資訊頁面的定製,像404,500錯誤。另一個我層面講,這樣做也是為了保護我們的一些重要資訊。此外,我們會給特定的人分配定定的許可權,而不是給其分配管理員許可權!

  sql注入

所謂SQL隱碼攻擊,就是透過一些含有特殊字元的sql語句傳送到伺服器欺騙伺服器並進行攻擊。(特殊字元:or, 單引號,--,空格)

  Sql注入的 防護

1.永遠不要信任使用者的輸入。對使用者的輸入進行校驗,可以透過正規表示式(js正則或者java後臺正則),或限制長度;對單引號和雙"-"進行轉換等。

2.永遠不要使用動態拼裝sql,使用引數化的sql。(永遠不要使用+號拼接sql字串,而是使用?傳參的方式進行)

3.不要給使用者太高的許可權而根據需求進行賦權

4.對敏感資訊進行加密 如md5(單向加密不可逆轉)。

5.自定義錯誤頁面。目的是為了不把我們的程式的bug暴露在別有用心的人的面前。而去不會讓使用者看到報錯的頁面,也提高了使用者的體驗度。

SQL隱碼攻擊防範

使用引數化的過濾性語句  要防禦SQL隱碼攻擊,使用者的輸入就絕對不能直接被嵌入到SQL語句中。恰恰相反,使用者的輸入必須進行過濾,或者使用引數化的語句。引數化的語句使用引數而不是將使用者輸入嵌入到語句中。在多數情況中,SQL語句就得以修正。然後,使用者輸入就被限於一個引數。

輸入驗證

  檢查使用者輸入的合法性,確信輸入的內容只包含合法的資料。資料檢查應當在客戶端和伺服器端(java程式碼)都執行之所以要執行伺服器端驗證,是為了彌補客戶端驗證機制脆弱的安全性。  在客戶端,攻擊者完全有可能獲得網頁的原始碼,修改驗證合法性的指令碼(或者直接刪除指令碼),然後將非法內容透過修改後的表單提交給伺服器。因此,要保證驗證操作確實已經執行,唯一的辦法就是在伺服器端也執行驗證。你可以使用許多內建的驗證物件,例如Regular Expression Validator,它們能夠自動生成驗證用的客戶端指令碼,當然你也可以插入伺服器端的方法呼叫。如果找不到現成的驗證物件,你可以透過Custom Validator自己建立一個。

錯誤訊息處理

  防範SQL隱碼攻擊,還要避免出現一些詳細的錯誤訊息,因為駭客們可以利用這些訊息。要使用一種標準的輸入確認機制來驗證所有的輸入資料的長度、型別、語句、企業規則等。

加密處理

將使用者登入名稱、密碼等資料加密儲存。加密使用者輸入的資料,然後再將它與資料庫中儲存的資料比較,這相當於對使用者輸入的資料進行了“消毒”處理,使用者輸入的資料不再對資料庫有任何特殊的意義,從而也就防止了攻擊者注入SQL命令。

儲存過程來執行所有的查詢

  SQL引數的傳遞方式將防止攻擊者利用單引號和連字元實施攻擊。此外,它還使得資料庫許可權可以限制到只允許特定的儲存過程執行,所有的使用者輸入必須遵從被呼叫的儲存過程的安全上下文,這樣就很難再發生注入式攻擊了。

使用專業的漏洞掃描工具

  攻擊者們目前正在自動搜尋攻擊目標並實施攻擊,其技術甚至可以輕易地被應用於其它的Web架構中的漏洞。企業應當投資於一些專業的漏洞掃描工具,如大名鼎鼎的Acunetix的Web漏洞掃描程式等。一個完善的漏洞掃描程式不同於網路掃描程式,它專門查詢網站上的SQL隱碼攻擊式漏洞。最新的漏洞掃描程式可以查詢最新發現的漏洞。

確保資料庫安全

  鎖定你的資料庫的安全,只給訪問資料庫的web應用功能所需的最低的許可權,撤銷不必要的公共許可,使用強大的加密技術來保護敏感資料並維護審查跟蹤。如果web應用不需要訪問某些表,那麼確認它沒有訪問這些表的許可權。如果web應用只需要只讀的許可權,那麼就禁止它對此表的 drop 、insert、update、delete 的許可權,並確保資料庫打了最新補丁。

安全審評

在部署應用系統前,始終要做安全審評。建立一個正式的安全過程,並且每次做更新時,要對所有的編碼做審評。開發隊伍在正式上線前會做很詳細的安全審評,然後在幾周或幾個月之後他們做一些很小的更新時,他們會跳過安全審評這關,“就是一個小小的更新,我們以後再做編碼審評好了”。請始終堅持做安全審評。

資料庫中常用術語:

ddl:資料定義語言 Create Drop Alter

dml:資料操縱語言 insert update delete select

dcl:資料控制語言 grant revoke

tcl:事務控制語言 commit rollback


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31555151/viewspace-2219434/,如需轉載,請註明出處,否則將追究法律責任。

相關文章