通过单例模式模拟RAC连接 (r4笔记第76天)

单例模式基本是学习设计模式的第一个模式,而且在工作中使用太普遍了,通用到我们感觉就应该是这样,但是如果真给你纸和笔,在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

本文分享自微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2015-03-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏令仔很忙

Hibernate从入门到放弃(三)----持久化对象

当对象刚创建,和Session没有发生任何关系时,当程序运行完成就立刻消失,被称为瞬时态。瞬态对象不会被持久化到数据库中,也不会被赋予持久化标识,如果程序中失...

14410
来自专栏技术翻译

JVM体系结构的解释

每个Java开发人员都知道字节码将由JRE(Java运行时环境)执行。但许多人并不知道JRE是Java虚拟机(JVM)的实现,它分析字节码,解释代码并执行它。作...

15220
来自专栏腾讯移动品质中心TMQ的专栏

从Java乱码谈起

在实际项目开发中,特别是涉及到中文输入输出的时候,大家肯定都被各种乱码问题坑过。如果遇到复杂的系统,为了乱码问题折腾几天也不是不可能。

55660
来自专栏菩提树下的杨过

maven: 打包可运行的jar包(java application)及依赖项处理

IDE环境中,可以直接用exec-maven-plugin插件来运行java application,类似下面这样: 1 <plugin> 2 <g...

24390
来自专栏小二的折腾日记

day5(面向对象2)

wait notify notifyAll 都使用在同步中,因为要对持有监视器(锁)的线程操作。所以要使用在同步中,以为只有同步才具有锁。 为什么这些操作线程...

6410
来自专栏LanceToBigData

linux(八)linux系统中查找文件二

前面介绍的是find命令,我们发现一个find命令居然有那么多的命令,我看到都要晕了,不管没有关系,加油。相信自己! 一、grep命令   1.1、作用   ...

21970
来自专栏大内老A

ASP.NET Core管道深度剖析(4):管道是如何建立起来的?

在《管道是如何处理HTTP请求的?》中,我们对ASP.NET Core的请求处理管道的构成以及它对请求的处理流程进行了详细介绍,接下来我们需要了解的是这样一个管...

20060
来自专栏前端大白专栏

angular使用管道实现搜索功能

56460
来自专栏Rgc

scrapy回调函数传递参数

scrapy.Request 的callback传参的两种方式 1.使用 lambda方式传递参数 def parse(self, response): ...

30130
来自专栏java一日一条

深入分析Java线程中断机制

在平时的开发过程中,相信都会使用到多线程,在使用多线程时,大家也会遇到各种各样的问题,今天我们就来说说一个多线程的问题——线程中断。在java中启动线程非常容易...

11220

扫码关注云+社区

领取腾讯云代金券