通過單例模式模擬RAC連線 (r4筆記第76天)
阿新 • • 發佈:2022-05-04
單例模式基本是學習設計模式的第一個模式,而且在工作中使用太普遍了,通用到我們感覺就應該是這樣,但是如果真給你紙和筆,在5分鐘內寫出一個完整的單例模式,估計還是有不少人會中招。 RAC是實時應用叢集,是oracle的一種高可用方案,假設我們有2個節點,如果其中一個節點出現問題,另外一個節點依然能夠正常工作,對於客戶端來說感覺是完全透明的,感覺不到任何的異常。 我們今天來通過設計模式的單例模式來模擬一下RAC連線的情況 首先是單例模式,一般都是認為一個類可以產生一個物件,如果物件的數量不收限制,也是可以實現的,這個就是單例模式的擴充套件。 我嘗試寫了如下的程式碼,模擬兩個節點的情況
import java.util.ArrayList; public class RacTest { private static final RacTest rac1= new RacTest(); private static final RacTest rac2= new RacTest(); private final static ArrayList<RacTest> racNodes = new ArrayList<RacTest>(); private RacTest(){} public static RacTest getInstance(){ int i = (int)(1+Math.random()*2)-1; if(racNodes.size()==0){ racNodes.add(rac1); racNodes.add(rac2); } System.out.println("rac instance "+(i+1)+" "+racNodes.get(i)); return racNodes.get(i); } public static void main(String[] args){ for(int i=0;i<20;i++){ RacTest.getInstance(); } } }
這樣,我們定義了兩個節點,在初始化的時候指定getInstance()方法,然後在每次呼叫的時候都只初始化一次。 當然從客戶端來說為了能夠更加清晰表達出連線節點的隨機性,我寫了一個迴圈,一次迴圈200次,打印出連線的情況,通過資料更能夠說明。可以從初始化的兩個物件的地址看到只有兩個物件。
rac instance 1 RacTest@42e816 rac instance 1 RacTest@42e816 rac instance 1 RacTest@42e816 rac instance 2 RacTest@9304b1 rac instance 1 RacTest@42e816 rac instance 1 RacTest@42e816 rac instance 2 RacTest@9304b1 rac instance 2 RacTest@9304b1 rac instance 1 RacTest@42e816 rac instance 2 RacTest@9304b1 rac instance 1 RacTest@42e816 rac instance 2 RacTest@9304b1 rac instance 2 RacTest@9304b1 rac instance 1 RacTest@42e816 rac instance 2 RacTest@9304b1 rac instance 1 RacTest@42e816 rac instance 1 RacTest@42e816 rac instance 1 RacTest@42e816 rac instance 1 RacTest@42e816 rac instance 2 RacTest@9304b1