歡迎光臨
每天分享高質量文章

Java Web技術經驗總結(十三)

1. 設計表的時候,主鍵的選擇

如果業務欄位是bigint型別,可以含義不會改變,則可以用作主鍵;更普遍的做法是,選擇單獨的id欄位作為表的主鍵(為了考慮後續水平擴展的需求,要求全域性唯一,即用發號器獲取);業務主鍵如果是字串型別的,也不能作為表的邏輯主鍵使用,因為太占用空間、效率低。關於這個主題的探討,可以參考:資料庫的唯一標示符(ID)的選擇

2. Mybatis使用技巧

在Mybatis中,一般會將SQL陳述句以K-V對寫在xxxMapper.xml檔案中,關於$和#兩種符號的區別:$符號表示MyBatis在動態替換過程中的字串替換;#符號是引數占位符,表示SQL陳述句的引數替換。參見:mybatis深入理解(一)之 # 與 $ 區別以及 sql 預編譯

3. Mybatis經典文章

鏈接:http://www.jianshu.com/p/ec40a82cae28。PS:這個系列的其他兩篇文章也非常不錯。

4. 千萬級的資料集合如何去重?

思路1:最朴素的思路是利用Java 8的集合API進行操作,這種情況下,如下程式跑完一次去重需要6s(我的機器是Mac Pro),那麼總共需要6000s,大概兩個小時;思路二:如果兩個集合的字串序列都能有序,就可以用位圖演算法進行標記,但是發現瓶頸在排序;思路三:借助外部系統,例如MySQL,將這批資料存放在表中,並建立索引,借助一個版本號進行標記。在實際專案中,我們評估了MySQL進群的處理能力,選擇了思路三,這和思路二一樣,都是換一種資料結構去思考和解決

  1. package org.java.learn.collection;

  2. import java.util.*;

  3. public class ARemoveBListExample {

  4.    public static void main(String[] args) {

  5.        Set<String> aSet = new HashSet<>();

  6.        Set<String> bSet = new HashSet<>();

  7.        for (int i = 0; i < 10000; i++) {

  8.            String str = UUID.randomUUID().toString();

  9.            aSet.add(str);

  10.            bSet.add(str);

  11.        }

  12.        for (int i = 0; i < 10000000; i++) {

  13.            aSet.add(UUID.randomUUID().toString());

  14.        }

  15.        //求A集合到B集合的差

  16.        long start = System.currentTimeMillis();

  17. //        List result = aSet.parallelStream().filter(a -> !bSet.contains(a)).collect(Collectors.toList());

  18.        aSet.removeIf(a -> bSet.contains(a));

  19.        long end = System.currentTimeMillis();        System.out.println("cost: " + (end-start) + "ms, result size:" + aSet.size());

  20.    }

  21. }

5. RESTful接口經驗

在構建REST服務時,需要提供統一的異常處理、統一的請求引數、統一的響應結構,利用基於註解的AOP可以實現這個功能。

6. BasicThreadFactory的使用

該類的實體不會直接創建執行緒,其內部使用的builder構建器負責創建執行緒,通過構建器樣式可以為要創建的執行緒配置很多屬性:命名規則、是否精靈行程,以及執行緒的優先級等熟悉。

7. MQ消費者設計經驗

在業務開發中,會有如下的應用場景:服務A有個執行緒池不斷消費來自MQ推送的訊息,只有消費完給MQ發出response之後才能繼續消費新的訊息;為了不讓訊息堆積,我們需要盡可能加快這個執行緒的處理能力,必要的時候需要將該執行緒中能異步做的工作異步掉,例如請求遠端的HTTP接口。這種場景下,就需要使用httpclient的異步呼叫,直接使用httpclient有點麻煩,最近接觸的vert.x提供了一個不錯的方法,可以參考:Vert.x HTTP Client

8. MyBatis應用技巧

傳入多個引數時,在xml檔案中如何獲得引數?參考:http://www.cnblogs.com/mingyue1818/p/3714162.html

9. MyBatis應用技巧

如何在應用程式中配置多資料源?參考:http://blog.csdn.net/isea533/article/details/46815385

10. 利用curl測試自己的服務接口

鏈接:http://droidyue.com/blog/2014/07/02/send-post-request-using-curl/index.html

最後做個投票,這個號後面的發展,有你的一份努力:

赞(0)

分享創造快樂