Oracle Coherence 内存网格

第 4 章 — 开始第一个 Coherence 程序

 

作者:金辉 (Oracle)

2016 年 5 月 23 日发布


右箭头 第 1 章 — 漫说内存网格
右箭头 第 2&3 章 — 安装和配置开发环境
右箭头 第 4 章 — 开始第一个 Coherence 程序
右箭头 第 5 章 — 在 Coherence 中使用 POF 对象
右箭头 第 6 章 — 分布式内存集群的数据灌注、查询和统计
右箭头 第 7 章 — 监听器处理内存集群中变化的对象
右箭头 第 8 章 — 使用 ZFS 加密
右箭头 第 9 章 — 内存集群与数据库的互操作
右箭头 第 10 章 — Coherence 内存集群的安全访问
右箭头 第 11 章 — 基于内存集群的事件处理

本章将介绍开发一个简单的,基于 Java 控制台的应用,来访问、更新和删除 Coherence 缓存集群中的信息。两个比较重要的 Java API:

  1. NamedCache:NamedCache 是一个 Map(映射表),用于装载在一个群集之间共享的资源。这些资源既可以在内存中管理,也可持久存储到数据库中,或作为缓存。
  2. CacheFactory:获得一个 Cache 的实例。

4.1 简介

 

所有的 Coherence 缓存都是有名字的(或说被命名),同时通过实现 com.tangosol.net.NamedCache interface,在集群实例中遵循自己的生命周期。NamedCache 接口扩展了 java.util.Map 接口,存储数据和资源,并在集群网络中共享。每个 NamedCache 对象通过键/值对存储数据。键和值都即可以是简单,也可以是复杂类型的对象。NamedCache 接口提供了 Map 接口的扩展,比如锁、同步、存储、查询、事件聚合和事务。

表 3-1 NamedCache Interface 的方法

 方法名称  描述
 void clear()  移除 NamedCache 对象里的所有记录
 boolean containsKey(Object key)  如果记录中包含相应的键,则返回 true
 boolean containsValue(Objectvalue)  如果在 NamedCache 对象中存在至少一条记录有这个对象值,则返回 true
 Object get(Object key)  通过给定的键,返回 NamedCache 对象中的值
 Object put(Object key,Objectvalue)  将给定的键值放到 NameCache 中,返回以前的对象(如果有)
 Object remove(Object key)  移除给定键的对象。继承自 ConcurrentMapinterface
 Set entrySet()  返回键值对的集合
 Collection values()  返回所有值的集合
 CacheService getCacheService()  返回该 NamedCache 所属的 CacheService

 

更多完整的 NamedCache interface 和 CacheFactory 类的方法,见文档 C:\Oracle\wls1212.32\coherence\doc

4.2 创建第一个基于 Coherence 的 Java 程序

 

4.2.1 创建一个程序,用于向 Cache 存值

 

由于在第 3 章中已经创建一个基于 Coherence 的 Java 项目,本章内容参见如下步骤:

1. 在 chapter03_07 项目的 appClientModule 下,创建新的 package
com.oracle.handson.chapter04

figure-01

2. 在这个 package 下建一个新的 Java Class:MyFirstSamplePut,并选择 the public static void main(String[] args)。

figure-02

3. 在 Eclipse 编辑器里,写如下代码:创建 NamedCache 对象,并存取值。

package com.oracle.handson.chapter04;

import com.tangosol.net.CacheFactory;
import com.tangosol.net.NamedCache;

public class MyFirstSamplePut {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        // 创建一个叫 mycache 的cache
        NamedCache myCache = CacheFactory.getCache("mycache");
        // 向这个 cache 存入键值对
        myCache.put("Name", "Coherence对象值");
        // 从这个 cache 取出键值对
        System.out.println("Coherence 缓存的对象值是: " + myCache.get("Name"));
    }
}

4. 先停止已运行的 Cache servers,参见 3.5.3。

5. 在 Eclipse IDE 中运行该程序:

右键点击 MyFirstSamplePut.java,Run As->Run Configuration。为方便,下面的步骤的内容是:新建一个 Coherence 运行配置

 运行配置名称  chapter04CacheClientMyFirstSample     
 project  Chapter03_07  Main选卡
 Main Class  com.oracle.handson.chapter04.MyFirstSamplePut  
 配置文件  coherence-cache-config.xml  Coherence选卡
 Local storage  Enabled(cache server)  Coherence选卡
 Cluster port  3155  Coherence选卡
 classpath  Coherence.jar 在 Bootstrap Entries 中  Classpath选卡

figure-03

figure-04

figure-05

点 Apply,然后 Run。

figure-06

4.2.2 创建一个程序用于从 Cache 中取值

 

新建一个 Java 类,使用 Coherence 的 Get 方法

1. 新建一个 Java 类 MyFirstSampleReader,方法同上节,代码如下

package com.oracle.handson.chapter04;

import com.tangosol.net.CacheFactory;

import com.tangosol.net.NamedCache;

public class MyFirstSampleReader {

public MyFirstSampleReader() {

// TODO Auto-generated constructor stub

}

public static void main(String[] args) {

// 确保在一个集群里

CacheFactory.ensureCluster();

// 创建或者获得一个叫 mycache 的缓存实例

NamedCache myCache = CacheFactory.getCache("mycache");

System.out.println("缓存的值是" + myCache.get("Name"));

}

}

2. 为 MyFirstSampleReader 建一个运行配置 chapter04CacheServerMyFirstSampleReader:Run As->Run Configuration。创建方法与过程同 4.2.1。

 运行配置名称  chapter04CacheClientMyFirstSample     
 project  Chapter03_07  Main选卡
 Main Class  com.oracle.handson.chapter04.MyFirstSamplePut  
 配置文件  coherence-cache-config.xml  Coherence选卡
 Local storage  Enabled(cache server)  Coherence选卡
 Cluster port  3155  Coherence选卡
 classpath  Coherence.jar 在 Bootstrap Entries 中  Classpath选卡

 

完成后点击 Run。

figure-07

这是会发现取缓存为 null。

3. 启动第 3 章中的 chapter03CacheServer

4. 运行上一节的 chapter04CacheClientMyFirstSample,运行后主程序完成,且退出。

figure-08

再运行 chapter04CacheClientMyFirstSampleReader

figure-09

由于 chapter04CacheClientMyFirstSample 和 chapter04CacheClientMyFirstSampleReader 都有选择了 storage-enable,所以尽管 MyFirstSamplePut 和 MyFirstSampleReader 都先后退出,但集群中保留有所存数据。下面我们可以测试一下 Local storage 配置为 Disabled 是什么结果。

将 chapter04CacheClientMyFirstSample 的 Coherence 选卡,Local storage 配置为 Disabled(cache client)

<

img alt="figure-10" src="/content/groups/public/@otn/documents/digitalasset/3230165_zhs.png" />

这个配置相当于 Java 启动参数 -Dtangosol.coherence.distributed.localstorage=false。

5. 停止所有 Cache Server,重新运行 chapter04CacheClientMyFirstSample,你会有类似下面的界面

figure-11

6. 启动第 3 章中的 chapter03CacheServer

运行 chapter04CacheClientMyFirstSample

运行 chapter04CacheClientMyFirstSampleReader

可以看到,两个 java 程序通过 Coherence 的内存集群持久化进行数据的交换。

figure-12

4.3 创建第一个基于 Coherence 的 Java 应用

 

在这个练习中,创建一个 Java 应用,访问、更新和删除 Coherence 集群中的信息。

Coherence-based 的应用通常不是连接到集群中,它们本身就是集群的一部分。

创建应用

运行应用

4.3.1 创建一个 Java 控制台 (Console Application) 应用

 

创建 Java console-based 应用访问、更新和删除 Coherence 集群中的简单类型对象:

1. 写一段 Java 控制台程序,调用 CacheFactory 类加入到集群环境(ensureCluster方法),离开集群(shutdown方法)。操作步骤基本同第三章"3.5.1 创建一个Conerence Java 类"。

1) 取保在集群中的方法,见 NamedCache 的 Javadoc。

2) 通过 getCache 获得一个 NamedCache 的实例。

3) 通过 NamedCache 实例,使用 get 方法获得相应的键值。

package com.oracle.handson.chapter04;

import com.tangosol.net.CacheFactory;

import com.tangosol.net.NamedCache;

public class JavaApp {

public JavaApp() {

// TODO Auto-generated constructor stub

}

public static void main(String[] args) {

// TODO Auto-generated method stub

CacheFactory.ensureCluster(); //ensureCluster(),确保在集群中

NamedCache myCache = CacheFactory.getCache("mycache");

String message = (String) myCache.get("message");

System.out.println(message);

CacheFactory.shutdown(); //shutdown() 离开集群

JavaApp testapp = new JavaApp();

}
}

 

4.3.2 运行这个控制台应用

 

步骤如下:

1. 运行第 3 章当中创建的 chapter03CacheServer。

2. 创建一个使用 Coherence 查询语言 (Coherence Query Language) 的 cache 客户端运行配置。

注释:Coherence Query Language 的更多内容见 Oracle 的在线文档。

1) 新建一个 Coherence 运行配置,在 Main class 中,输入 QueryPlus 以帮助定位。

figure-13

2) 在 Coherence 选卡中,选择 Disabled (cache client);集群端口就沿用之前的 3155。

figure-14

figure-15

3) 在 Arguments 选卡中,VM 的参数里输入 -showversion。

figure-16

4) 在 Common 选卡中,选择 Shared file,并找到当前工程 chapter03_07

figure-17

点 Apply

3. 运行这个 QueryPlus 客户端,可以看到:

figure-18

4. 在 CohQL> 提示符中,输入如下命令,建立一个 cache 实例,并连接到这个实例

CohQL> create cache "mycache"

 

figure-19

5. 为 4.2 里新建的 JavaApp 创建一个运行环境,起名为 chapter04CacheClientApp。

figure-20

在 Coherence 选卡中,选择 Enabled (cache server) ;集群端口配置为 3155。

6. 执行这个

figure-21

7. 在 Eclipse 控制台里,使用 QueryPlus,输入如下命令


CohQL> insert into "mycache" key "message" value "hello"

再次运行 chapter04CacheClientApp

figure-22

8. 将 chapter04CacheClientApp 的 Local storage 从 Enabled 变为 Disabled,再次运行,结果与第 7 步一样。

9. 将 Cache 服务器停止,并停止 cache 客户端, 运行 chapter04CacheClientApp,输出为 null。

10. 在 QueryPlus cache 客户端里,还可以

CohQL>select key(), value() from "mycache" where key() is "message"

 

figure-23

关于作者

 niehao

金辉,在 Oracle 负责云和中间件产品的资深售前顾问和团队经理,有十多年的中间件和项目管理经验,专注在企业云构建,企业集成解决方案领域,熟悉业内主要的 SOA 集成产品。参加过北京马拉松和 TNF50 越野比赛。你可以通过邮件 arthur.jin@oracle.com 与他联系。