通过单例模式模拟RAC连接 (r4笔记第76天)
时间:2022-05-04
本文章向大家介绍通过单例模式模拟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
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【每日一题】45. Jump Game II
- 「Elasticsearch + Lucene」搜索引擎的架构、倒排索引和搜索过程
- 查看 MAC JDK默认安装路径 JAVA路径 的shell 命令
- Gradle 命令行介紹和安裝教程
- Spring工厂创建复杂对象
- Nginx反向代理配置去除前缀
- 深入浅出java虚拟机
- Maven resources 分环境
- JetBrains Upsource(上源) 研究
- Spring JPA 拓展
- python自学成才之路 死锁的解决方案
- C++核心准则T.40: 使用函数对象向算法传递操作
- web页面性能优化总结及原理解释
- C++核心准则T.41:在模板概念中只对本质属性定义需求
- Linux实用技巧——mail发送邮件命令以及中文乱码解决