文章
动态脚本语言
作者:Pas Apicella
作为 Coherence Extend 客户端访问 Coherence 网格有一些显著的性能优势。
2011 年 2 月发布
Oracle Coherence 内存中数据网格是一个数据管理系统,它为多台服务器间共享的应用程序对象提供 服务,旨在满足这些对象对快速响应、极高的吞吐量、可预测的伸缩性、持续的可用性和信息可靠 性的要求。凭借这些功能,Oracle Coherence 非常适用于计算密集型的会话状态中间层应用程序。 Coherence 旨在运行于应用程序层,通常与应用程序本身一起在进程中运行(例如在应用服务器集 群中)。
以下方法文档介绍如何从 JRuby 作为 Coherence Extend 客户端使用可移植对象格式 (POF) 访问 Coherence 缓存。我们使用 extend 客户端和 POF 的原因是:

本演示将使用大家熟悉的 HR 模式数据,此数据从 Oracle 数据库 加载到 Coherence 集群中。然后我们将从 JRuby 脚本作为一个 extend 客户端来访问集群数据, 以避免加入集群作为其成员的开销。
可以使用以下软件:
| Oracle Database 11g 第 2 版 | Oracle Database 软件下载 |
| Oracle Coherence for Java 3.6.1 版 | Oracle Coherence 软件下载 |
| JDK 1.6 | Java SE 下 载 |
| JRuby 1.5.6 | jruby.org |
| Oracle Database 11g 第 2 版 JDBC 驱动程序 | 从 Oracle Database 11g 第 2 版 JDBC 驱动程序下载 ojdbc6.jar。可以从 JDBC 驱动程序下载页面下载适用于其他版本的 Oracle Database 或 JDK 的驱动程序。 |
| Apache Ant | apache.org 或通过操作系统程序包 管理程序 |
| 示例代码 | 可以从这里 下载示例代码。解压缩到主目录。这将创建两个目录:jruby_coherence 和 hr_demo |
这些示例也适用于其他版本。
安装每个组件时需遵循推荐的安装说明。
在一个终端窗口中,设置 Oracle 环境并验证已安装了 Oracle 标准的人力资源 (HR) 演示模式 。
$ sqlplus hr/welcome
[. . .]
SQL> select table_name from user_tables;
TABLE_NAME
------------------------------
COUNTRIES
JOBS
EMPLOYEES
LOCATIONS
DEPARTMENTS
JOB_HISTORY
REGIONS
如果没有该模式,请参阅 Oracle Database Sample Schemas 11g Release 2 (11.2) 指南中的 Installing the HR Schema。
验证是否已在文件系统上解压缩 Oracle Coherence for Java 3.6.1:
$ ls -l $HOME/coherence
total 16
drwxr-xr-x 2 pas usergrp 4096 Feb 14 13:07 bin
drwxr-xr-x 3 pas usergrp 4096 Feb 14 13:07 doc
drwxr-xr-x 3 pas usergrp 4096 Feb 14 13:07 lib
-rw-r--r-- 1 pas usergrp 100 Nov 9 14:49 product.xml
验证是否已安装 JDK 1.6:
$ java -version
java version "1.6.0_23"
Java(TM) SE Runtime Environment (build 1.6.0_23-b05)
Java HotSpot(TM) 64-Bit Server VM (build 19.0-b09, mixed mode)
将 JRUBY_HOME 设置为 JRuby 的安装目录,并验证 JRuby 是否在路径中:
$ export JRUBY_HOME=$HOME/jruby-1.5.6
$ export PATH=$PATH:$JRUBY_HOME/bin
$ jruby -v
jruby 1.5.6 (ruby 1.8.7 patchlevel 249) (2010-12-03 9cf97c3)
(Java HotSpot(TM) 64-Bit Server VM 1.6.0_23) [amd64-java]
需要在三个终端窗口中设置相同的环境,以便跟踪所设置的变量。
验证 Apache Ant 是否已安装并在路径中可用:
$ export PATH=$PATH:$HOME/apache-ant-1.8.2/bin
$ ant -version
Apache Ant(TM) version 1.8.2 compiled on December 20 2010
编辑示例代码文件 jruby_coherence/build.properties 以定义运行演示所需的 Coherence 主 目录。如果计算机上的内存不足,也可以减小 JVM 的堆大小。
# oracle.coherence.home
#
oracle.coherence.home=/home/pas/coherence
# jvmargs
#
# JVM args to pass into the command at runtime to set heap size etc
jvmargs=-server -showversion -Xms512m -Xmx512m
编辑 jruby_coherence/src/db.properties 以连接 HR 数据库模式。仅当将数据从数据库加载 到缓存中时才需要这样做,因此这只需使用一次:
# db properties
dburl=jdbc:oracle:thin:@localhost/orcl
dbuser=hr
dbpassword=welcome
编辑 jruby_coherence/build.xml 并在 Run SECOND 和 Run THIRD 注释中找到两个代理-主机设置。设置此值以指定您的计算机的节点主机名或 IP 地址:
. . .
<!-- Run SECOND
Starts a storage disabled coherence proxy server node , enabling
clients to access the coherence cluster. It does not store any data but
is a member of the cluster to provide access to remote clients -->
<target name="run-default-extend" depends="package"
description="Run a proxy server">
. . .
<sysproperty key="proxy.host"
value="localhost"/>
. . .
<!-- Run THIRD
This is the remote client node which loads data into the cache connecting
to the proxy server node -->
<target name="run-default-extend-client" depends="package"
description="Run the extend client to load data">
. . .
<sysproperty key="proxy.host"
value="localhost"/>
. . .
同时将 ojdbc6.jar 复制到解压缩的演示目录 jruby_coherence/lib 中:
$ cp ojdbc6.jar jruby_coherence/lib
$ ls -l jruby_coherence/lib
total 2128
-rw-r--r-- 1 pas usergrp 2152051 Oct 14 09:22 ojdbc6.jar
转到演示目录并启动缓存服务器。只需键入 ant,随即会运行该演示的 build.xml 中的默认 Ant 任务(在注释 Run FIRST 下)。这将启动缓存服务器节点。运行时不会返 回命令提示符。(注意:这是第一个启动缓存服务器的请求,在执行之前,必须在启动缓存服务器 之前编译所需的服务器/客户端类,然后将其打包成 oraclehrdemo.jar 文件。此客户端 JAR 文件 是必需的,因为它包含稍后将要执行的查询缓存数据所需的类和 XML 文件。)
$ cd jruby_coherence
$ ant
Buildfile: /home/pas/jruby_coherence/jruby_coherence/build.xml
init:
[mkdir] Created dir: /home/pas/jruby_coherence/jruby_coherence/classes
compile:
. . .
package:
[jar] Building jar:
/home/pas/jruby_coherence/jruby_coherence/lib/oraclehrdemo.jar
run-default:
[echo] Starting cache server with jvm args : -server -showversion
-Xms512m -Xmx512m
[java] java version "1.6.0_23"
[java] Java(TM) SE Runtime Environment (build 1.6.0_23-b05)
[java] Java HotSpot(TM) 64-Bit Server VM (build 19.0-b09, mixed mode)
[java]
. . .
[java] (
[java] ClusterService{Name=Cluster, State=(SERVICE_STARTED,
STATE_JOINED), Id=0, Version=3.6, OldestMemberId=1}
[java] InvocationService{Name=Management, State=(SERVICE_STARTED),
Id=1, Version=3.1, OldestMemberId=1}
[java] PartitionedCache{Name=DistributedCache, State=(SERVICE_STARTED),
LocalStorage=enabled, PartitionCount=257, BackupCount=1,
AssignedPartitions=257, BackupPartitions=0}
[java] )
[java]
[java] Started DefaultCacheServer...
可以启动多个缓存服务器(甚至在多台计算机上)。对于此演示,我们只需一个缓存服务器节点 。
如果您遇到原因为“package oracle.jdbc.pool does not exist”的编译错误,请 确认是否已将 ojdbc6.jar 复制到 jruby_coherence/lib。
此时,我们将启动代理服务器。此服务器将禁用存储,只能用于为 Extend 客户端查询缓存。请 在启动缓存服务器的节点上启动代理服务器。有关更多信息,请参见《Oracle Coherence Client Guide Release 3.6.1》手册中的 Setting Up Coherence*Extend 一节。
Coherence 集群必须包括 extend 代理服务才能接受 extend 客户端连接,并且必须包括缓存, 以便客户端用来检索和存储数据。exted 代理服务和缓存都是在集群的缓存配置部署描述符文件中 配置。Extend 代理服务和缓存将作为缓存服务器 (DefaultCacheServer) 进程的一部分启动。
启动一个新的 shell,再次设置 JRUBY_PATH 和 PATH 环境变量。使用 ant 目标 run-default -extend 运行代理服务器节点,如下所示。同样,此操作不会返回命令提示符:
$ ant run-default-extend
Buildfile: /home/cjones/jruby_coherence/build.xml
init:
compile:
...
package:
run-default-extend:
[echo] Starting cache server proxy with jvm args :
-server -showversion -Xms512m -Xmx512m
[java] java version "1.6.0_23"
[java] Java(TM) SE Runtime Environment (build 1.6.0_23-b05)
[java] Java HotSpot(TM) 64-Bit Server VM (build 19.0-b09, mixed mode)
[java]
[java] 2011-02-14 16:38:44.205/0.832 Oracle Coherence 3.6.1.0 <Info>
(thread=main, member=n/a): Loaded operational configuration from
"jar:file:/home/cjones/coherence/lib/coherence.jar!/tangosol-coherence.xml"
[java] 2011-02-14 16:38:44.263/0.890 Oracle Coherence 3.6.1.0 <Info>
(thread=main, member=n/a): Loaded operational overrides from
"jar:file:/home/cjones/coherence/lib/coherence.jar!/tangosol-coherence-override-
dev.xml"
[java] 2011-02-14 16:38:44.274/0.901 Oracle Coherence 3.6.1.0 <D5>
(thread=main, member=n/a): Optional configuration override
"/tangosol-coherence-override.xml" is not specified
[java] 2011-02-14 16:38:44.306/0.933 Oracle Coherence 3.6.1.0 <D5>
(thread=main, member=n/a): Optional configuration override "/custom-
mbeans.xml"
is not specified
[java]
[java] Oracle Coherence Version 3.6.1.0 Build 19636
[java] Grid Edition: Development mode
[java] Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights
reserved.
[java]
[java] 2011-02-14 16:38:45.081/1.708 Oracle Coherence GE 3.6.1.0 <Info>
(thread=main, member=n/a): Loaded cache configuration from
"jar:file:/home/cjones/jruby_coherence/lib/oraclehrdemo.jar!/coherence-cache-
config.xml"
[java] 2011-02-14 16:38:45.972/2.599 Oracle Coherence GE 3.6.1.0 <D4>
(thread=main, member=n/a): TCMP bound to /130.35.70.193:8090 using SystemSocketProvider
[java] 2011-02-14 16:38:49.439/6.066 Oracle Coherence GE 3.6.1.0 <Info>
(thread=Cluster, member=n/a): Created a new cluster "cluster:0xC4DB" with
Member(Id=1,
Timestamp=2011-02-14 16:38:45.981, Address=130.35.70.193:8090, MachineId=59329,
Location=site:usdhcp.oraclecorp.com,machine:dhcp-5op3-5op4-west-130-35-70-
19,process:6490,
Role=CoherenceServer, Edition=Grid Edition, Mode=Development, CpuCount=1,
SocketCount=1)
UID=0x822346C10000012E26C14DDDE7C11F9A
[java] 2011-02-14 16:38:49.450/6.077 Oracle Coherence GE 3.6.1.0 <Info>
(thread=main, member=n/a): Started cluster Name=cluster:0xC4DB
[java]
[java] Group{Address=224.3.6.0, Port=36000, TTL=4}
[java]
[java] MasterMemberSet
[java] (
[java] ThisMember=Member(Id=1, Timestamp=2011-02-14 16:38:45.981,
Address=130.35.70.193:8090, MachineId=59329,
Location=site:usdhcp.oraclecorp.com,machine:dhcp-5op3-5op4-west-130-35-70- 19,process:6490,
Role=CoherenceServer)
[java] OldestMember=Member (Id=1, Timestamp=2011-02-14 16:38:45.981,
Address=130.35.70.193:8090, MachineId=59329, Location=site:usdhcp.oraclecorp.com,
machine:dhcp-5op3-5op4-west -130-35-70-19,process:6490, Role=CoherenceServer)
[java] ActualMemberSet=MemberSet(Size=1, BitSetCount=2
[java] Member(Id=1, Timestamp=2011-02-14 16:38:45.981, Address=130.35.70.193:8090,
MachineId=59329, Location=site:usdhcp.oraclecorp.com,
machine:dhcp-5op3-5op4-west-130-35-70- 19,process:6490, Role=CoherenceServer)
[java] )
[java] RecycleMillis=1200000
[java] RecycleSet=MemberSet(Size=0, BitSetCount=0
[java] )
[java] )
[java]
[java] TcpRing {Connections=[]}
[java] IpMonitor{AddressListSize=0}
[java]
[java] 2011-02-14 16:38:49.518/6.145 Oracle Coherence GE 3.6.1.0 <Info>
(thread=Cluster, member=1): Loaded POF configuration from
"jar:file:/home/cjones/jruby_coherence/lib/oraclehrdemo.jar!/hr-pof-
config.xml"
[java] 2011-02-14 16:38:49.572/6.199 Oracle Coherence GE 3.6.1.0 <Info>
(thread=Cluster, member=1): Loaded included POF configuration from
"jar:file:/home/cjones/coherence/lib/coherence.jar!/coherence-pof-config.xml"
[java] 2011-02-14 16:38:49.922/6.549 Oracle Coherence GE 3.6.1.0 <D5>
(thread=Invocation:Management, member=1):
Service Management joined the cluster with senior service member 1
[java] 2011-02-14 16:38:50.397/7.024 Oracle Coherence GE 3.6.1.0 <D5>
(thread=DistributedCache, member=1): Service DistributedCache joined the cluster with
senior service member 1
[java] 2011-02-14 16:38:50.923/7.550 Oracle Coherence GE 3.6.1.0 <Info>
(thread=Proxy:ExtendTcpProxyService:TcpAcceptor, member=1): TcpAcceptor now
listening for connections on 130.35.70.193:9099
[java] 2011-02-14 16:38:50.939/7.570 Oracle Coherence GE 3.6.1.0 <D5>
(thread=Proxy:ExtendTcpProxyService:TcpAcceptor, member=1): Started:
TcpAcceptor{Name=Proxy:ExtendTcpProxyService:TcpAcceptor, State=(SERVICE_STARTED),
ThreadCount=5, HungThreshold=0, TaskTimeout=0, Codec=Codec(Format=POF),
Serializer=com.tangosol.io.pof.ConfigurablePofContext, PingInterval=0, PingTimeout=0,
RequestTimeout=0, SocketProvider=SystemSocketProvider, LocalAddress=
[/130.35.70.193:9099],
SocketOptions{LingerTimeout=0, KeepAliveEnabled=true, TcpDelayEnabled=false},
ListenBacklog=0, BufferPoolIn=BufferPool(BufferSize=2KB, BufferType=DIRECT,
Capacity=Unlimited), BufferPoolOut=BufferPool(BufferSize=2KB, BufferType=DIRECT,
Capacity=Unlimited)}
[java] 2011-02-14 16:38:50.954/7.581 Oracle Coherence GE 3.6.1.0 <D5>
(thread=Proxy:ExtendTcpProxyService, member=1): Service ExtendTcpProxyService joined
the cluster with senior service member 1
[java] 2011-02-14 16:38:50.959/7.586 Oracle Coherence GE 3.6.1.0 <Info>
(thread=main, member=1):
[java] Services
[java] (
[java] ClusterService{Name=Cluster, State=(SERVICE_STARTED, STATE_JOINED),
Id=0, Version=3.6, OldestMemberId=1}
[java] InvocationService{Name=Management, State=(SERVICE_STARTED), Id=1,
Version=3.1, OldestMemberId=1}
[java] PartitionedCache{Name=DistributedCache, State=(SERVICE_STARTED),
LocalStorage=disabled}
[java] ProxyService{Name=ExtendTcpProxyService, State=(SERVICE_STARTED),
Id=3, Version=3.2, OldestMemberId=1}
[java] )
[java]
[java] Started DefaultCacheServer...
[java]
从日志中的 MasterMemberSet 部分,可以看到该节点已加入集群并开始等待请求。在仍在运行 的缓存服务器节点的输出日志的末尾(第一个终端窗口),也可以看到新节点加入了集群:
[java] 2011-03-07 15:33:09.132/1332.883 Oracle Coherence GE 3.6.1.0 <D5>
(thread=Cluster, member=1): Member(Id=2, Timestamp=2011-03-07 15:33:08.97,
Address=10.0.2.15:8090, MachineId=2063, Location=process:7380, Role=CoherenceServer)
joined Cluster with senior member 1
[java] 2011-03-07 15:33:09.757/1333.506 Oracle Coherence GE 3.6.1.0 <D5>
(thread=Cluster, member=1): Member 2 joined Service Management with senior member 1
[java] 2011-03-07 15:33:10.592/1334.341 Oracle Coherence GE 3.6.1.0 <D5>
(thread=Cluster, member=1): Member 2 joined Service DistributedCache with senior member
1
[java] 2011-03-07 15:33:10.947/1334.696 Oracle Coherence GE 3.6.1.0 <D5>
(thread=Cluster, member=1): Member 2 joined Service ExtendTcpProxyService with senior
member 2
打开第三个终端窗口,再次设置环境。现在,运行 extend 客户端将数据加载到缓存中 。这只是将表 DEPARTMENTS 和 EMPLOYEES 加载到缓存中,提供一些数据让我们可以从 JRuby 进行 访问:
$ ant run-default-extend-client
Buildfile: /home/cjones/jruby_coherence/build.xml
init:
compile:
...
package:
run-default-extend-client:
[echo] Starting extend client with jvm args : -server -showversion -Xms512m -
Xmx512m
. . .
[java] Oracle Coherence Version 3.6.1.0 Build 19636
[java] Grid Edition: Development mode
[java] Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights
reserved.
. . .
[java] INFO: Connected to db with URL : jdbc:oracle:thin:@localhost/orcl
[java] Mar 7, 2011 4:23:01 PM pas.au.coherence.hr.client.LoadDataIntoCoherence
doLogMessage
[java] INFO: DEPT CACHE size : 27
[java] Mar 7, 2011 4:23:01 PM pas.au.coherence.hr.client.LoadDataIntoCoherence
doLogMessage
[java] INFO: EMP CACHE size : 107
BUILD SUCCESSFUL
Total time: 2 seconds
如果使用的是默认的模式数据,输出将显示有 27 条部门记录和 107 条员工记录加载到了缓存 服务器。
现在,我们可以创建一个 JRuby extend 客户端脚本,该脚本会将缓存中的一些数据显示到控制 台上。
将步骤 2.5 中创建的 oraclehrdemo.jar 复制到 hr_demo 目录:
$ cp ~/jruby_coherence/lib/oraclehrdemo.jar ~/hr_demo
查看示例文件 hr_demo/jruby_cohextendclient.rb 并根据系统的实际情况更改 Coherence jar 的位置。如果需要,同时更新 proxy.host:JRuby 脚本将作为 extend 客户端连接到代理服务器节 点,查询两个已知缓存的名称,并将缓存数据输出到控制台。
# jruby_cohextendclient.rb
require 'java'
require File.dirname(__FILE__) + '/oraclehrdemo.jar'
# Update for your environment
require '/home/cjones/coherence/lib/coherence.jar'
import com.tangosol.net.CacheFactory
import com.tangosol.net.NamedCache
import java.lang.System
import java.lang.Integer
puts "*********************************************************"
puts "Coherence 3.6 Oracle HR Extend Client Example from JRuby"
puts "*********************************************************"
print "Started at ", Time.now, "\n"
begin
# setup required properties to connect to proxy server as extend client
System.setProperty("tangosol.coherence.cacheconfig", "client-cache-
config.xml")
System.setProperty("tangosol.pof.enabled", "true")
System.setProperty("tangosol.pof.config", "hr-pof-config.xml")
System.setProperty("proxy.host", "localhost") # Update for your environment
# get named caches
depscache = CacheFactory.getCache("dep-cache")
empscache = CacheFactory.getCache("emp-cache")
#retrieve size of caches
print "\nCache [depscache] size = " , depscache.size()
print "\nCache [empscache] size = " , empscache.size() , "\n\n"
#show all departments
print "** All DEPARTMENT Records **\n"
deptiterator = depscache.entrySet().iterator
while deptiterator.hasNext()
entry = deptiterator.next()
print "Key : [" , entry.getKey() , "] "
print "Value : " , entry.getValue()
puts
end
#get department 10
deptid = Integer.new(10)
deptrecord = depscache.get(deptid)
print "\n** DEPARTMENT 10 **\n"
print deptrecord
puts
#show all employees who have a JOB ROLE = 'SH_CLERK'
print "\n** All EMPLOYEE Records with job role = 'SH_CLERK' **\n"
filter = com.tangosol.util.filter.EqualsFilter.new("getJobId",
"SH_CLERK")
employees = empscache.entrySet(filter)
print "Size of employees after filter applied = " , employees.size() ,
"\n"
empiterator = employees.iterator()
i = 0
while empiterator.hasNext()
empentry = empiterator.next()
i = i + 1
print "- Record " , i , "\n"
print "Key : " , empentry.getKey() , " \n"
print "Employee [employeeId=" , empentry.getValue().getEmployeeId() ,
", firstName=" , empentry.getValue().getFirstName() ,
", lastName=" , empentry.getValue().getLastName() ,
", jobId=" , empentry.getValue().getJobId() , "]\n"
end
rescue
print "\n** Error occured **\n"
print "Failed to display HR data from cache ", $!, "\n\n"
end
print "\nEnded at ", Time.now, "\n"
在第三个终端中,更改到 hr_demo 目录并运行 jruby_cohextendclient.rb。
$ cd ~/hr_demo
$ jruby jruby_cohextendclient.rb
/home/cjones/jruby-1.5.6/lib/ruby/site_ruby/shared/builtin/javasupport/
core_ext/object.rb:99 warning: already initialized constant Integer
*********************************************************
Coherence 3.6 Oracle HR Extend Client Example from JRuby
*********************************************************
Started at Mon Mar 07 17:27:28 -0800 2011
2011-03-07 17:27:28.976/3.819 Oracle Coherence 3.6.1.0 <Info>
(thread=main, member=n/a): Loaded operational configuration from
"jar:file:/home/cjones/coherence/lib/coherence.jar!/tangosol-coherence.xml"
2011-03-07 17:27:29.037/3.880 Oracle Coherence 3.6.1.0 <Info>
(thread=main, member=n/a): Loaded operational overrides from
"jar:file:/home/cjones/coherence/lib/coherence.jar!/
tangosol-coherence-override-dev.xml"
2011-03-07 17:27:29.041/3.884 Oracle Coherence 3.6.1.0 <D5>
(thread=main, member=n/a): Optional configuration override
"/tangosol-coherence-override.xml" is not specified
2011-03-07 17:27:29.103/3.946 Oracle Coherence 3.6.1.0 <D5>
(thread=main, member=n/a): Optional configuration override
"/custom-mbeans.xml" is not specified
Oracle Coherence Version 3.6.1.0 Build 19636
Grid Edition: Development mode
Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
2011-03-07 17:27:29.718/4.561 Oracle Coherence GE 3.6.1.0 <Info>
(thread=main, member=n/a): Loaded cache configuration from
"jar:file:/home/cjones/hr_demo/./oraclehrdemo.jar!/client-cache-config.xml"
2011-03-07 17:27:30.183/5.026 Oracle Coherence GE 3.6.1.0 <Info>
(thread=RemoteCache:TcpInitiator, member=n/a): Loaded POF configuration from
"jar:file:/home/cjones/hr_demo/./oraclehrdemo.jar!/hr-pof-config.xml"
2011-03-07 17:27:30.232/5.075 Oracle Coherence GE 3.6.1.0 <Info>
(thread=RemoteCache:TcpInitiator, member=n/a): Loaded included POF configuration from
"jar:file:/home/cjones/coherence/lib/coherence.jar!/coherence-pof-config.xml"
2011-03-07 17:27:30.834/5.677 Oracle Coherence GE 3.6.1.0 <D5>
(thread=RemoteCache:TcpInitiator, member=n/a): Started:
TcpInitiator{Name=RemoteCache:TcpInitiator, State=(SERVICE_STARTED), ThreadCount=0,
Codec=Codec(Format=POF), Serializer=com.tangosol.io.pof.ConfigurablePofContext,
PingInterval=0, PingTimeout=0, RequestTimeout=0, ConnectTimeout=0,
SocketProvider=SystemSocketProvider, RemoteAddresses=[/10.0.2.15:9099],
SocketOptions{LingerTimeout=0, KeepAliveEnabled=true, TcpDelayEnabled=false}}
2011-03-07 17:27:30.861/5.704 Oracle Coherence GE 3.6.1.0 <D5>
(thread=main, member=n/a): Connecting Socket to 10.0.2.15:9099
2011-03-07 17:27:30.872/5.716 Oracle Coherence GE 3.6.1.0 <Info>
(thread=main, member=n/a): Connected Socket to 10.0.2.15:9099
Cache [depscache] size = 27
Cache [empscache] size = 107
** All DEPARTMENT Records **
Key : [100] Value : Department [departmentId=100 ,departmentName=Finance ,
managerId=108 ,locationId=1700]
Key : [20] Value : Department [departmentId=20 ,departmentName=Marketing ,
managerId=201 ,locationId=1800]
Key : [270] Value : Department [departmentId=270 ,departmentName=Payroll ,
managerId=0 ,locationId=1700]
Key : [90] Value : Department [departmentId=90 ,departmentName=Executive ,
managerId=100 ,locationId=1700]
Key : [150] Value : Department [departmentId=150 ,departmentName=Shareholder Services ,
managerId=0 ,locationId=1700]
Key : [250] Value : Department [departmentId=250 ,departmentName=Retail Sales ,
managerId=0 ,locationId=1700]
Key : [80] Value : Department [departmentId=80 ,departmentName=Sales ,
managerId=145 ,locationId=2500]
Key : [110] Value : Department [departmentId=110 ,departmentName=Accounting ,
managerId=205 ,locationId=1700]
Key : [50] Value : Department [departmentId=50 ,departmentName=Shipping ,
managerId=121 ,locationId=1500]
Key : [140] Value : Department [departmentId=140 ,departmentName=Control And Credit ,
managerId=0 ,locationId=1700]
Key : [60] Value : Department [departmentId=60 ,departmentName=IT ,managerId=103 ,
locationId=1400]
Key : [260] Value : Department [departmentId=260 ,departmentName=Recruiting ,
managerId=0 ,locationId=1700]
Key : [40] Value : Department [departmentId=40 ,departmentName=Human Resources ,
managerId=203 ,locationId=2400]
Key : [240] Value : Department [departmentId=240 ,departmentName=Government Sales ,
managerId=0 ,locationId=1700]
Key : [130] Value : Department [departmentId=130 ,departmentName=Corporate Tax ,
managerId=0 ,locationId=1700]
Key : [180] Value : Department [departmentId=180 ,departmentName=Construction ,
managerId=0 ,locationId=1700]
Key : [120] Value : Department [departmentId=120 ,departmentName=Treasury ,
managerId=0 ,locationId=1700]
Key : [70] Value : Department [departmentId=70 ,departmentName=Public Relations ,
managerId=204 ,locationId=2700]
Key : [200] Value : Department [departmentId=200 ,departmentName=Operations ,
managerId=0 ,locationId=1700]
Key : [230] Value : Department [departmentId=230 ,departmentName=IT Helpdesk ,
managerId=0 ,locationId=1700]
Key : [170] Value : Department [departmentId=170 ,departmentName=Manufacturing ,
managerId=0 ,locationId=1700]
Key : [220] Value : Department [departmentId=220 ,departmentName=NOC ,
managerId=0 ,locationId=1700]
Key : [190] Value : Department [departmentId=190 ,departmentName=Contracting ,
managerId=0 ,locationId=1700]
Key : [10] Value : Department [departmentId=10 ,departmentName=Administration ,
managerId=200 ,locationId=1700]
Key : [210] Value : Department [departmentId=210 ,departmentName=IT Support ,
managerId=0 ,locationId=1700]
Key : [160] Value : Department [departmentId=160 ,departmentName=Benefits ,
managerId=0 ,locationId=1700]
Key : [30] Value : Department [departmentId=30 ,departmentName=Purchasing ,
managerId=114 ,locationId=1700]
** DEPARTMENT 10 **
Department [departmentId=10 ,departmentName=Administration ,managerId=200 ,
locationId=1700]
** All EMPLOYEE Records with job role = 'SH_CLERK' **
Size of employees after filter applied = 20
- Record 1
Key : DepertmentIdKey [departmentId=50, employeeId=189]
Employee [employeeId=189, firstName=Jennifer, lastName=Dilly, jobId=SH_CLERK]
- Record 2
Key : DepertmentIdKey [departmentId=50, employeeId=182]
Employee [employeeId=182, firstName=Martha, lastName=Sullivan, jobId=SH_CLERK]
- Record 3
Key : DepertmentIdKey [departmentId=50, employeeId=197]
Employee [employeeId=197, firstName=Kevin, lastName=Feeney, jobId=SH_CLERK]
- Record 4
Key : DepertmentIdKey [departmentId=50, employeeId=191]
Employee [employeeId=191, firstName=Randall, lastName=Perkins, jobId=SH_CLERK]
- Record 5
Key : DepertmentIdKey [departmentId=50, employeeId=183]
Employee [employeeId=183, firstName=Girard, lastName=Geoni, jobId=SH_CLERK]
- Record 6
Key : DepertmentIdKey [departmentId=50, employeeId=187]
Employee [employeeId=187, firstName=Anthony, lastName=Cabrio, jobId=SH_CLERK]
- Record 7
Key : DepertmentIdKey [departmentId=50, employeeId=186]
Employee [employeeId=186, firstName=Julia, lastName=Dellinger, jobId=SH_CLERK]
- Record 8
Key : DepertmentIdKey [departmentId=50, employeeId=180]
Employee [employeeId=180, firstName=Winston, lastName=Taylor, jobId=SH_CLERK]
- Record 9
Key : DepertmentIdKey [departmentId=50, employeeId=199]
Employee [employeeId=199, firstName=Douglas, lastName=Grant, jobId=SH_CLERK]
- Record 10
Key : DepertmentIdKey [departmentId=50, employeeId=181]
Employee [employeeId=181, firstName=Jean, lastName=Fleaur, jobId=SH_CLERK]
- Record 11
Key : DepertmentIdKey [departmentId=50, employeeId=184]
Employee [employeeId=184, firstName=Nandita, lastName=Sarchand, jobId=SH_CLERK]
- Record 12
Key : DepertmentIdKey [departmentId=50, employeeId=185]
Employee [employeeId=185, firstName=Alexis, lastName=Bull, jobId=SH_CLERK]
- Record 13
Key : DepertmentIdKey [departmentId=50, employeeId=188]
Employee [employeeId=188, firstName=Kelly, lastName=Chung, jobId=SH_CLERK]
- Record 14
Key : DepertmentIdKey [departmentId=50, employeeId=194]
Employee [employeeId=194, firstName=Samuel, lastName=McCain, jobId=SH_CLERK]
- Record 15
Key : DepertmentIdKey [departmentId=50, employeeId=195]
Employee [employeeId=195, firstName=Vance, lastName=Jones, jobId=SH_CLERK]
- Record 16
Key : DepertmentIdKey [departmentId=50, employeeId=193]
Employee [employeeId=193, firstName=Britney, lastName=Everett, jobId=SH_CLERK]
- Record 17
Key : DepertmentIdKey [departmentId=50, employeeId=190]
Employee [employeeId=190, firstName=Timothy, lastName=Gates, jobId=SH_CLERK]
- Record 18
Key : DepertmentIdKey [departmentId=50, employeeId=196]
Employee [employeeId=196, firstName=Alana, lastName=Walsh, jobId=SH_CLERK]
- Record 19
Key : DepertmentIdKey [departmentId=50, employeeId=192]
Employee [employeeId=192, firstName=Sarah, lastName=Bell, jobId=SH_CLERK]
- Record 20
Key : DepertmentIdKey [departmentId=50, employeeId=198]
Employee [employeeId=198, firstName=Donald, lastName=OConnell, jobId=SH_CLERK]
Ended at Mon Mar 07 17:27:33 -0800 2011
文件 hr_demo/jruby_hash_cohextend.rb 将数据从部门缓存复制到 Ruby 哈希数据结构 并重复执行,以验证复制是否已成功执行。根据系统的实际情况更改 Coherence jar 的位置并在需 要的情况下更新 proxy.host:
# jruby_hash_cohextend.rb
require 'java'
require File.dirname(__FILE__) + '/oraclehrdemo.jar'
require '/home/cjones/coherence/lib/coherence.jar' # Update for your environment
import com.tangosol.net.CacheFactory
import com.tangosol.net.NamedCache
import java.lang.System
puts "*********************************************************"
puts "Coherence 3.6 Oracle HR Extend Client Example from JRuby"
puts "*********************************************************"
print "Started at ", Time.now, "\n"
begin
# setup required properties to connect to proxy server as extend client
System.setProperty("tangosol.coherence.cacheconfig",
"client-cache-config.xml")
System.setProperty("tangosol.pof.enabled", "true")
System.setProperty("tangosol.pof.config", "hr-pof-config.xml")
# Update for your environment
System.setProperty("proxy.host", "localhost")
# get named cache dep-cache
depscache = CacheFactory.getCache("dep-cache")
#retrieve size of caches
print "\nCache [depscache] size = " , depscache.size() , "\n\n"
deptiterator = depscache.entrySet().iterator
depthash = Hash.new
#copy all department cache data into ruby hash data structure
while deptiterator.hasNext()
entry = deptiterator.next()
depthash[entry.getKey()] = entry.getValue()
end
#display hash
print "Displaing hash data structure of department cache \n"
print "Is Hash structure depthash empty : ", depthash.empty?,
"\n"
print "Hash structure depthash size: ", depthash.length, "\n"
keys = depthash.keys
for key in 0...depthash.length
print "key : ", keys[key], " "
print "value : ", depthash[keys[key]], "\n"
end
rescue
print "\n** Error occured **\n"
print "Failed to display HR data from cache ", $!, "\n\n"
end
print "\nEnded at ", Time.now, "\n"
运行 jruby_hash_cohextend.rb 并验证输出如下所示:
$ jruby jruby_hash_cohextend.rb ********************************************************* Coherence 3.6 Oracle HR Extend Client Example from JRUBY ********************************************************* Started at Mon Mar 07 17:36:12 -0800 2011 2011-03-07 17:36:12.529/3.240 Oracle Coherence 3.6.1.0
(thread=main, member=n/a): Loaded operational configuration from
"jar:file:/home/cjones/coherence/lib/coherence.jar!/tangosol- coherence.xml"
2011-03-07 17:36:12.565/3.275 Oracle Coherence 3.6.1.0
(thread=main, member=n/a): Loaded operational overrides from
"jar:file:/home/cjones/coherence/lib/coherence.jar!/
tangosol-coherence- override-dev.xml"
2011-03-07 17:36:12.567/3.277 Oracle Coherence 3.6.1.0
(thread=main, member=n/a): Optional configuration override
"/tangosol -coherence-override.xml" is not specified
2011-03-07 17:36:12.611/3.321 Oracle Coherence 3.6.1.0
(thread=main, member=n/a):
Optional configuration override "/custom-mbeans.xml" is not specified
Oracle Coherence Version 3.6.1.0 Build 19636
Grid Edition: Development mode
Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
2011-03-07 17:36:13.070/3.780 Oracle Coherence GE 3.6.1.0
(thread=main, member=n/a): Loaded cache configuration from
"jar:file:/home/cjones/hr_demo/./oraclehrdemo.jar!/client-cache- config.xml"
2011-03-07 17:36:13.577/4.287 Oracle Coherence GE 3.6.1.0
(thread=RemoteCache:TcpInitiator, member=n/a):
Loaded POF configuration from
"jar:file:/home/cjones/hr_demo/./oraclehrdemo.jar!/hr-pof- config.xml"
2011-03-07 17:36:13.620/4.330 Oracle Coherence GE 3.6.1.0
(thread=RemoteCache:TcpInitiator, member=n/a):
Loaded included POF configuration from
"jar:file:/home/cjones/coherence/lib/coherence.jar!/coherence-pof- config.xml"
2011-03-07 17:36:14.249/4.959 Oracle Coherence GE 3.6.1.0
(thread=RemoteCache:TcpInitiator, member=n/a):
Started: TcpInitiator {Name=RemoteCache:TcpInitiator, State=(SERVICE_STARTED),
ThreadCount=0, Codec=Codec(Format=POF),
Serializer=com.tangosol.io.pof.ConfigurablePofContext, PingInterval=0,
PingTimeout=0, RequestTimeout=0, ConnectTimeout=0,
SocketProvider=SystemSocketProvider,
RemoteAddresses=[/10.0.2.15:9099], SocketOptions{LingerTimeout=0,
KeepAliveEnabled=true,
TcpDelayEnabled=false}}
2011-03-07 17:36:14.275/4.985 Oracle Coherence GE 3.6.1.0
(thread=main, member=n/a): Connecting Socket to 10.0.2.15:9099
2011-03-07 17:36:14.291/5.001 Oracle Coherence GE 3.6.1.0
(thread=main, member=n/a): Connected Socket to 10.0.2.15:9099
Cache [depscache] size = 27
Displaing hash data structure of department cache
Is Hash structure depthash empty : false
Hash structure depthash size: 27
key : 100 value : Department [departmentId=100 ,departmentName=Finance ,
managerId=108 ,locationId=1700]
key : 20 value : Department [departmentId=20 ,departmentName=Marketing ,
managerId=201 ,locationId=1800]
key : 270 value : Department [departmentId=270 ,departmentName=Payroll ,
managerId=0 ,locationId=1700]
key : 90 value : Department [departmentId=90 ,departmentName=Executive ,
managerId=100 ,locationId=1700]
key : 150 value : Department [departmentId=150 ,departmentName=Shareholder Services ,
managerId=0 ,locationId=1700]
key : 250 value : Department [departmentId=250 ,
departmentName=Retail Sales ,managerId=0 ,locationId=1700]
key : 80 value : Department [departmentId=80 ,
departmentName=Sales ,managerId=145 ,locationId=2500]
key : 110 value : Department [departmentId=110 ,
departmentName=Accounting ,managerId=205 ,locationId=1700]
key : 50 value : Department [departmentId=50 ,
departmentName=Shipping ,managerId=121 ,locationId=1500]
key : 140 value : Department [departmentId=140 ,
departmentName=Control And Credit ,managerId=0 ,locationId=1700]
key : 60 value : Department [departmentId=60 ,
departmentName=IT ,managerId=103 ,locationId=1400]
key : 260 value : Department [departmentId=260 ,
departmentName=Recruiting ,managerId=0 ,locationId=1700]
key : 40 value : Department [departmentId=40 ,
departmentName=Human Resources ,managerId=203 ,locationId=2400]
key : 240 value : Department [departmentId=240 ,
departmentName=Government Sales ,managerId=0 ,locationId=1700]
key : 130 value : Department [departmentId=130 ,
departmentName=Corporate Tax ,managerId=0 ,locationId=1700]
key : 180 value : Department [departmentId=180 ,
departmentName=Construction ,managerId=0 ,locationId=1700]
key : 120 value : Department [departmentId=120 ,
departmentName=Treasury ,managerId=0 ,locationId=1700]
key : 70 value : Department [departmentId=70 ,
departmentName=Public Relations ,managerId=204 ,locationId=2700]
key : 200 value : Department [departmentId=200 ,
departmentName=Operations ,managerId=0 ,locationId=1700]
key : 230 value : Department [departmentId=230 ,
departmentName=IT Helpdesk ,managerId=0 ,locationId=1700]
key : 170 value : Department [departmentId=170 ,
departmentName=Manufacturing ,managerId=0 ,locationId=1700]
key : 220 value : Department [departmentId=220 ,
departmentName=NOC ,managerId=0 ,locationId=1700]
key : 190 value : Department [departmentId=190 ,
departmentName=Contracting ,managerId=0 ,locationId=1700]
key : 10 value : Department [departmentId=10 ,
departmentName=Administration ,managerId=200 ,locationId=1700]
key : 210 value : Department [departmentId=210 ,
departmentName=IT Support ,managerId=0 ,locationId=1700]
key : 160 value : Department [departmentId=160 ,
departmentName=Benefits ,managerId=0 ,locationId=1700]
key : 30 value : Department [departmentId=30 ,
departmentName=Purchasing ,managerId=114 ,locationId=1700]
Ended at Mon Mar 07 17:36:15 -0800 2011
最后,将在 Coherence 缓存中插入一个部门。这样做不会将更改持久保存到数据库,因 为该主题不在本文的范围之内。有关利用 Coherence 对直读、直写、提前刷新和后写入式缓存的支 持的更多信息,请访问此处链接。数据库用于为 缓存提供数据源(填充缓存),不过更新数据库的主题不在本文讨论范围之内。
查看 hr_demo/jruby_insert_cohextend.rb。根据系统的实际情况更改 Coherence jar 的位置 并在需要的情况下更新 proxy.host:在这个 JRuby 脚本中,我们创建了一个新的 Department Java 对象,并将其插入名为“dep-cache”的缓存,然后验证它确实成为了缓存的一部 分。
# jruby_insert_cohextend.rb
require 'java'
require File.dirname(__FILE__) + '/oraclehrdemo.jar'
require '/home/cjones/coherence/lib/coherence.jar' # Update for your environment
import com.tangosol.net.CacheFactory
import com.tangosol.net.NamedCache
import java.lang.System
import java.lang.Integer
import "pas.au.coherence.hr.server.Department"
puts "*********************************************************"
puts "Coherence 3.6 Oracle HR Extend Client Example from JRuby"
puts "*********************************************************"
print "Started at ", Time.now, "\n"
begin
# setup required properties to connect to proxy server as extend client
System.setProperty("tangosol.coherence.cacheconfig", "client-cache-
config.xml")
System.setProperty("tangosol.pof.enabled", "true")
System.setProperty("tangosol.pof.config", "hr-pof-config.xml")
System.setProperty("proxy.host", "localhost") # Update for your
environment
# get named cache dep-cache
depscache = CacheFactory.getCache("dep-cache")
# retrieve size of cache
print "\nCache [depscache] size = " , depscache.size() , "\n\n"
# insert department 280 into cache
deptid = Integer.new(280)
newdept = Department.new
newdept.setDepartmentId(280)
newdept.setDepartmentName("JRuby Department")
depscache.put(deptid, newdept)
puts "Department 280 added to cache"
# retrieve record 280 ensuring it make it's way into the cache
deptrecord = depscache.get(deptid)
print "\n** DEPARTMENT 280 **\n"
print deptrecord
puts
# retrieve size of cache to verify inserted record exists
print "\nCache [depscache] size = " , depscache.size() , "\n"
rescue
print "\n** Error occured **\n"
print "Failed to display HR data from cache ", $!, "\n\n"
end
print "\nEnded at ", Time.now, "\n"
运行 jruby_insert_cohextend.rb,如下所示:
$ jruby jruby_insert_cohextend.rb
/home/cjones/jruby-1.5.6/lib/ruby/site_ruby/shared/builtin/
javasupport/core_ext/object.rb:99 warning: already initialized constant Integer
*********************************************************
Coherence 3.6 Oracle HR Extend Client Example from JRUBY
*********************************************************
Started at Mon Mar 07 17:42:50 -0800 2011
2011-03-07 17:42:50.803/3.705 Oracle Coherence 3.6.1.0 <Info>
(thread=main, member=n/a): Loaded operational configuration from
"jar:file:/home/cjones/coherence/lib/coherence.jar!/tangosol-coherence.xml"
2011-03-07 17:42:50.832/3.734 Oracle Coherence 3.6.1.0 <Info>
(thread=main, member=n/a): Loaded operational overrides from
"jar:file:/home/cjones/coherence/lib/coherence.jar!/tangosol-coherence-override-
dev.xml"
2011-03-07 17:42:50.835/3.737 Oracle Coherence 3.6.1.0 <D5>
(thread=main, member=n/a): Optional configuration override
"/tangosol-coherence-override.xml" is not specified
2011-03-07 17:42:50.890/3.792 Oracle Coherence 3.6.1.0 <D5>
(thread=main, member=n/a): Optional configuration override "/custom-
mbeans.xml"
is not specified
Oracle Coherence Version 3.6.1.0 Build 19636
Grid Edition: Development mode
Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
2011-03-07 17:42:51.388/4.290 Oracle Coherence GE 3.6.1.0 <Info>
(thread=main, member=n/a): Loaded cache configuration from
"jar:file:/home/cjones/hr_demo/./oraclehrdemo.jar!/client-cache-config.xml"
2011-03-07 17:42:51.797/4.699 Oracle Coherence GE 3.6.1.0 <Info>
(thread=RemoteCache:TcpInitiator, member=n/a): Loaded POF configuration from
"jar:file:/home/cjones/hr_demo/./oraclehrdemo.jar!/hr-pof-config.xml"
2011-03-07 17:42:51.835/4.737 Oracle Coherence GE 3.6.1.0 <Info>
(thread=RemoteCache:TcpInitiator, member=n/a): Loaded included POF configuration
from "jar:file:/home/cjones/coherence/lib/coherence.jar!/coherence-pof-
config.xml"
2011-03-07 17:42:52.362/5.264 Oracle Coherence GE 3.6.1.0 <D5>
(thread=RemoteCache:TcpInitiator, member=n/a): Started:
TcpInitiator{Name=RemoteCache:TcpInitiator, State=(SERVICE_STARTED), ThreadCount=0,
Codec=Codec(Format=POF), Serializer=com.tangosol.io.pof.ConfigurablePofContext,
PingInterval=0, PingTimeout=0, RequestTimeout=0, ConnectTimeout=0,
SocketProvider=SystemSocketProvider, RemoteAddresses=[/10.0.2.15:9099],
SocketOptions{LingerTimeout=0, KeepAliveEnabled=true, TcpDelayEnabled=false}}
2011-03-07 17:42:52.389/5.291 Oracle Coherence GE 3.6.1.0 <D5>
(thread=main, member=n/a): Connecting Socket to 10.0.2.15:9099
2011-03-07 17:42:52.402/5.304 Oracle Coherence GE 3.6.1.0
<Info> (thread=main, member=n/a): Connected Socket to 10.0.2.15:9099
Cache [depscache] size = 27
Department 280 added to cache
** DEPARTMENT 280 **
Department [departmentId=280 ,departmentName=JRuby Department ,
managerId=0 ,locationId=0]
Cache [depscache] size = 28
Ended at Mon Mar 07 17:42:52 -0800 2011 本文向您介绍了如何从 JRuby 脚本作为 Coherence Extend 客户端访问 Coherence 网格。通过 JRuby,我们能够使用 Oracle Coherence 内存中数据网格来查询缓存、用键值搜索特定记录、插入 新记录以及将缓存数据复制到 Ruby 哈希结构。
Pas Apicella [oracle.com 的 pas.apicella] 是 Oracle 的首席技 术支持工程师。