1. 程式人生 > >2018-12-18筆記

2018-12-18筆記

Spring事務的隔離級別

 1. ISOLATION_DEFAULT(預設): 這是一個PlatfromTransactionManager預設的隔離級別,使用資料庫預設的事務隔離級別.
      另外四個與JDBC的隔離級別相對應
 2. ISOLATION_READ_UNCOMMITTED(未提交讀): 這是事務最低的隔離級別,它充許令外一個事務可以看到這個事務未提交的資料。
      這種隔離級別會產生髒讀,不可重複讀和幻像讀。
 3. ISOLATION_READ_COMMITTED(已提交讀): 保證一個事務修改的資料提交後才能被另外一個事務讀取。另外一個事務不能讀取該事務未提交的資料
 4. ISOLATION_REPEATABLE_READ(可重複讀): 這種事務隔離級別可以防止髒讀,不可重複讀。但是可能出現幻像讀。
      它除了保證一個事務不能讀取另一個事務未提交的資料外,還保證了避免下面的情況產生(不可重複讀)。
 5. ISOLATION_SERIALIZABLE (序列化):這是花費最高代價但是最可靠的事務隔離級別。事務被處理為順序執行。
      除了防止髒讀,不可重複讀外,還避免了幻像讀。

MySQL預設可重複讀,Oracle預設已提交讀。

 

靜態注入和動態注入的區別

 

 

ArrayList超過初始化空間之後是如何進行擴容的?

如果通過無參構造的話,初始陣列容量為0,當真正對陣列進行新增時,才真正分配容量。每次按照1.5倍(位運算)的比率通過copeOf的方式擴容。
在JKD1.6中實現是,如果通過無參構造的話,初始陣列容量為10,每次通過copeOf的方式擴容後容量為原來的1.5倍。

ArrayList相當於在沒指定initialCapacity時就是會使用延遲分配物件陣列空間,當第一次插入元素時才分配10(預設)個物件空間。
假如有20個數據需要新增,那麼會分別在第一次的時候,將ArrayList的容量變為10 ;之後擴容會按照1.5倍增長。

也就是當新增第11個數據的時候,Arraylist繼續擴容變為10*1.5=15;當新增第16個數據時,繼續擴容變為15 * 1.5 =22個。:
  向陣列中新增第一個元素時,陣列容量為10.
  向陣列中新增到第10個元素時,陣列容量仍為10.
  向陣列中新增到第11個元素時,陣列容量擴為15.
  向陣列中新增到第16個元素時,陣列容量擴為22.
每次擴容都是通過Arrays.copyOf(elementData, newCapacity) 這樣的方式實現的。

 

MySQL和Orale分頁的區別

如果我們是通過JDBC的方式訪問資料庫,那麼就有必要根據資料庫型別採取不同的SQL分頁語句,對於MySql資料庫,我們可以採用limit語句進行分頁,對於Oracle資料庫,我們可以採用rownum的方式進行分頁.

(1)MySql的Limit m,n語句
Limit後的兩個引數中,引數m是起始下標,它從0開始;引數n是返回的記錄數。我們需要分頁的話指定這兩個值即可

(2)Oracle資料庫的rownum
在Oracle資料庫中,分頁方式沒有MySql這樣簡單,它需要依靠rownum來實現.
Rownum表示一條記錄的行號,值得注意的是它在獲取每一行後才賦予.因此,想指定rownum的區間來取得分頁資料在一層查詢語句中是無法做到的,要分頁還要進行一次查詢.

SELECT * FROM
(
SELECT A.*, ROWNUM RN
FROM (SELECT * FROM TABLE_NAME) A
WHERE ROWNUM <= 40
)
WHERE RN >= 21

其中最內層的查詢SELECT * FROM TABLE_NAME表示不進行翻頁的原始查詢語句。ROWNUM <= 40和RN >= 21控制分頁查詢的每頁的範圍。

上面給出的這個分頁查詢語句,在大多數情況擁有較高的效率。分頁的目的就是控制輸出結果集大小,將結果儘快的返回。在上面的分頁查詢語句中,這種考慮主要體現在WHERE ROWNUM <= 40這句上。

選 擇第21到40條記錄存在兩種方法,一種是上面例子中展示的在查詢的第二層通過ROWNUM <= 40來控制最大值,在查詢的最外層控制最小值。而另一種方式是去掉查詢第二層的WHERE ROWNUM <= 40語句,在查詢的最外層控制分頁的最小值和最大值。這是,查詢語句如下:

SELECT * FROM
(
SELECT A.*, ROWNUM RN
FROM (SELECT * FROM TABLE_NAME) A
)
WHERE RN BETWEEN 21 AND 40

對比這兩種寫法,絕大多數的情況下,第一個查詢的效率比第二個高得多。這是由於CBO優化模式下,Oracle可以將外層的查詢條件推到內層查詢中,以提高內層查詢的執行效率。對於第一個查詢語句,第二層的查詢條件WHERE ROWNUM <= 40就可以被Oracle推入到內層查詢中,這樣Oracle查詢的結果一旦超過了ROWNUM限制條件,就終止查詢將結果返回了。而第二個查詢語句,由於查詢條件BETWEEN 21 AND 40是存在於查詢的第三層,而Oracle無法將第三層的查詢條件推到最內層(即使推到最內層也沒有意義,因為最內層查詢不知道RN代表什麼)。因此,對於第二個查詢語句,Oracle最內層返回給中間層的是所有滿足條件的資料,而中間層返回給最外層的也是所有資料。資料的過濾在最外層完成,顯然這個效率 要比第一個查詢低得多。

上面分析的查詢不僅僅是針對單表的簡單查詢,對於最內層查詢是複雜的多表聯合查詢或最內層查詢包含排序的情況一樣有效。

 

說一下zk和dubbo

 

執行緒和程序的區別,執行緒的有幾種狀態

程序和執行緒
程序包括多個執行緒,一個程序可以有多個執行緒,每個獨立執行著的程式稱為一個程序,程序中最少有一個執行緒,簡單的說程序就是作業系統的一個軟體,執行緒就是程序中的一條執行路徑

多執行緒的好處:多執行緒提高執行效率、可以提高資源利用率

從巨集觀意義上講多執行緒同一時刻執行多個執行緒,微觀意義上來說cpu同一時刻只執行一個執行緒

主執行緒和子執行緒
主執行緒:是指系統提供的執行緒,又叫main執行緒,由jvm虛擬機器提供
子執行緒:需要程式設計師自己建立,又叫工作執行緒

執行緒從建立、執行到結束總是處於下面五個狀態之一:新建狀態、就緒狀態、執行狀態、阻塞狀態及死亡狀態。

 

單例模式中懶漢和惡漢的區別

/**
 * 餓漢模式
 */
public class HungrySingle {
    private static final HungrySingle sInstance = new HungrySingle();
    private HungrySingle() {
    }
    public static HungrySingle getInstance() {
        return sInstance;
    }
}

在餓漢模式中,初始化變數的時候最好加上 final 關鍵字,這樣比較嚴謹。

/**
 * 懶漢模式
 */
public static LazySingle getInstance() {
    if (sInstance == null) {
        sInstance = new LazySingle();
    }
    return sInstance;
}

一般這樣寫的,在大多數情況下這樣寫是沒問題的,但是如果在多執行緒併發執行的時候,就會很容易出現安全隱患。

/**
 * 懶漢模式
 */
public class LazySingle {
    private static LazySingle sInstance = null;
    private LazySingle() {
    }
    public static LazySingle getInstance() {
        if (sInstance == null) {
            synchronized (LazySingle.class) {
                if (sInstance == null) {
                    sInstance = new LazySingle();
                }
            }
        }
        return sInstance;
    }
}

 

        // 餓漢式:
        public class Singleton{
            private static Singleton singleton = new Singleton ();
            private Singleton (){}
            public static Singleton getInstance(){return singletion;}
       } 

       // 懶漢式:
       public class Singleton{
            private static Singleton singleton = null;
            public static synchronized getInstance(){
                 if(singleton==null){
                     singleton = new Singleton();
                 }
                return singleton;
            }
       }         

比較:
餓漢式是執行緒安全的,在類建立的同時就已經建立好一個靜態的物件供系統使用,以後不再改變。
懶漢式如果在建立例項物件時不加上synchronized則會導致物件的訪問不是執行緒安全的。
推薦使用第一種

從實現方式來講他們最大的區別就是懶漢式是延時載入,它是在需要的時候才建立物件,而餓漢式在虛擬機器啟動的時候就會建立,
餓漢式無需關注多執行緒問題,但是它是載入類時建立例項,所以如果是一個工廠模式、快取了很多例項、那麼就得考慮效率問題,因為這個類一載入則把所有例項不管用不用一塊建立。
懶漢式的優點是延時載入,缺點是不是執行緒同步的。