Coherence装载数据的研究 - Invocation Service
这里验证第三个方法,原理是将需要装载的数据分载在所有的存储节点上,不同的地方是利用了存储节点提供的InvocationService进行装载,而不是PreloadRequest,
原理如图

前提条件是:
- 需要知道所有要装载的key值
- 需要根据存储节点的数目把key值进行分摊,这里是通过
- Map<Member, List<String>> divideWork(Set members)这个方法,输入Coherence的存储节点成员,输出一个map结构,以member为key,所有的entry key值为value.
- 装载数据的任务,主要是通过驱动MyLoadInvocable的run方法,把数据在各个节点中进行装载,MyLoadInvocable必须扩展AbstractInvocable并实现PortableObject,不知何解,我尝试实现Seriable方法,结果出错
- 在拆解所有key值的任务过程中,发现list<String>数组被后面的值覆盖,后来每次放入map的时候新建一个List才避免此现象发生.
- 不需要实现CacheLoader或者CacheStore方法
Person.java
|
package dataload; import java.io.Serializable; public class Person implements Serializable { public void setId(String Id) { public String getId() { public void setFirstname(String Firstname) { public String getFirstname() { public void setLastname(String Lastname) { public String getLastname() { public void setAddress(String Address) { public String getAddress() { public Person() { public Person(String sId,String sFirstname,String sLastname,String sAddress) { |
MyLoadInvocable.java
装载数据的任务,主要是通过驱动这个任务的run方法,把数据在各个节点中进行装载
|
package dataload; import com.tangosol.io.pof.PofReader; import java.io.IOException; import java.sql.Connection; import java.util.Hashtable; import javax.naming.Context; import serp.bytecode.NameCache; public class MyLoadInvocable extends AbstractInvocable implements PortableObject { private List<String> m_memberKeys; public MyLoadInvocable() { public MyLoadInvocable(List<String> memberKeys, String cache) { public Connection getConnection() { Hashtable<String,String> ht = new Hashtable<String,String>(); m_con = ds.getConnection(); return m_con; public void run() { try for(int i = 0; i < m_memberKeys.size(); i++) String id = (String)m_memberKeys.get(i); stmt.setString(1, id); } } stmt.close(); }catch (Exception e) } public void readExternal(PofReader in) /** } |
LoadUsingEP.java
装载的客户端,负责数据分段,InvocationService查找以及驱动。
|
package dataload; import com.tangosol.net.CacheFactory; import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import javax.naming.Context; public class LoaderUsingEP { private Connection m_con; public Connection getConnection() { Hashtable<String,String> ht = new Hashtable<String,String>(); m_con = ds.getConnection(); return m_con; protected Set getStorageMembers(NamedCache cache) protected Map<Member, List<String>> divideWork(Set members) try { int onecount = totalcount / membercount; sql = "select id from persons"; ResultSet rs1 = st.executeQuery(sql); while (rs1.next()) { if (count < onecount) { list.add(rs1.getString("id")); Member member = (Member) i.next(); ArrayList<String> list2=new ArrayList<String>(); list.clear(); /* print the list value } currentworker ++; if (currentworker == membercount-1) { } } Member member = (Member) i.next(); st.close(); for(Map.Entry<Member, List<String>> entry:mapWork.entrySet()){ } public void load() Set members = getStorageMembers(cache); Map<Member, List<String>> mapWork = divideWork(members); InvocationService service = (InvocationService) for (Map.Entry<Member, List<String>> entry : mapWork.entrySet()) Member member = entry.getKey(); MyLoadInvocable task = new MyLoadInvocable(memberKeys, cache.getCacheName()); public static void main(String[] args) { } |
需要配置的客户端schema
storage-override-client.xml
|
<?xml version="1.0"?> <read-write-backing-map-scheme> <internal-cache-scheme> <cachestore-scheme> <listener/> <invocation-scheme> </caching-schemes> |
存储节点的Schema
|
<?xml version="1.0"?> <read-write-backing-map-scheme> <internal-cache-scheme> <cachestore-scheme> <listener/> <invocation-scheme> </caching-schemes> |
输出结果



可见数据分片装载.
Coherence装载数据的研究 - Invocation Service的更多相关文章
- Coherence装载数据的研究-PreloadRequest
最近给客户准备培训,看到Coherence可以通过三种方式批量加载数据,分别是: Custom application InvocableMap - PreloadRequest Invocation ...
- 使用 Hive装载数据的几种方式
装载数据 1.以LOAD的方式装载数据 LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION( ...
- WinCE数据通讯之Web Service分包传输篇
前面写过<WinCE数据通讯之Web Service篇>那篇对于数据量不是很大的情况下单包传输是可以了,但是对于大数据量的情况下WinCE终端的内存往往会在解包或者接受数据时产生内存溢出. ...
- db2 load命令装载数据时定位错误出现的位置
使用如下命令装载数据(注意CPU_PARALLELISM 1): db2 load from filename.del of del replace into tab_name CPU_PARALL ...
- 总结一下用caffe跑图片数据的研究流程
近期在用caffe玩一些数据集,这些数据集是从淘宝爬下来的图片.主要是想研究一下对女性衣服的分类. 以下是一些详细的操作流程,这里总结一下. 1 爬取数据.写爬虫从淘宝爬取自己须要的数据. 2 数据预 ...
- Android开发 ---ContentProvider数据提供者,Activity和Service就是上下文对象,短信监听器,内容观察者
1.activity_main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayou ...
- 基于Web Service的客户端框架搭建一:C#使用Http Post方式传递Json数据字符串调用Web Service
引言 前段时间一直在做一个ERP系统,随着系统功能的完善,客户端(CS模式)变得越来越臃肿.现在想将业务逻辑层以下部分和界面层分离,使用Web Service来做.由于C#中通过直接添加引用的方来调用 ...
- WinCE数据通讯之Web Service篇
准备写个WinCE平台与数据库服务器数据通讯交互方面的专题文章,今天先整理个Web Service通讯方式. 公司目前的硬件产品平台是WinCE5.0,数据通讯是连接服务器与终端的桥梁,关系着终端的数 ...
- 对Yii 2.0模型rules的理解(load()无法正确装载数据)
在实际开发中,遇到数据表新增字段而忘记了在对应模型中rules规则中添加新增的字段,而导致load()方法装载不到新增字段,导致新增字段无法写入数据库中. 解决办法:在新增字段后及时在对应模型ru ...
随机推荐
- python_plot画图参数设置
# coding:utf-8 import pandas as pd import numpy as np import matplotlib.pyplot as plt # one_hot数据的读取 ...
- bzoj 1096 斜率优化DP
首先比较容易的看出来是DP,w[i]为前i个工厂的最小费用,那么w[i]=min(w[j-1]+cost(j,i))+c[i],但是这样是不work的,复杂度上明显过不去,这样我们考虑优化DP. 设A ...
- 【IDEA】设置类头注释和方法注释
idea和eclipse的注释还是有一些差别的. 类头注释: 打开file->setting->Editor->Filr and Code Templates->Include ...
- Ubuntu破解开机密码
使用Ubuntu和使用windows系列产品一样,会忘记开机密码.难道我们在忘记开机密码的时候就必须重装系统吗?当然不是了!既然在windows下面我们可以破解开机密码,那么在Ubuntu里面一样可行 ...
- 查询ubuntu系统版本相关信息
查询ubuntu系统版本相关信息 sky@sky-virtual-machine:~$ cat /etc/issueUbuntu 12.04.5 LTS \n \l proc目录下记录的当前系统运行的 ...
- xdebug参数说明
;;;;;;;;;;;;;;;;;;;;;;;;; Basic Features; xdebug基本功能,如堆栈跟踪,递归错误安全输出,时间内存跟踪等;;;;;;;;;;;;;;;;;;;;;;;;; ...
- SQL Server数据库优化笔记
不定时更新 select DateDiff(month,'2018-06-07',GETDATE()) PACTBEGINDATE ORDER BY PACTBEGINDATE ASC),GETDAT ...
- BZOJ 1800
1800: [Ahoi2009]fly 飞行棋 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1622 Solved: 1293[Submit][St ...
- 《Java编程思想》笔记 第八章 多态
1.向上转型 把子类引用当作父类引用.(子类对象赋值给父类引用) 2.绑定 确定方法属于哪个类. 3.前期绑定 程序执行前绑定. 4.后期绑定也叫动态绑定 程序运行时绑定. 5.多态 多个不同的对象对 ...
- __rb_tree_rebalance
Inline void __rb_tree_rebalance(__rb_tree_node_base* x, __rb_tree_node_base*& root) //当前节点,根 { x ...