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 ...
随机推荐
- xampp命令
XAMPP命令安装 XAMPPtar xvfz xampp-linux-1.6.4.tar.gz -C /opt启动 XAMPP/opt/lampp/lampp start停止 XAMPP/opt/l ...
- LeetCode 10 Regular Expression Match
'.' Matches any single character.'*' Matches zero or more of the preceding element. The matching sho ...
- 命令行工具PathMarker
一直使用Guake 终端,Guake提供的其中一个功能是快速打开. 大概的意思就是,显示在终端上的数据会经过匹配,如果符合一定的规则,则可以按住ctrl,使用鼠标单击以触发指定操作. 比如对于一个文件 ...
- Linux实现利用SSH远程登录服务器详解
Linux实现利用SSH远程登录服务器详解 http://www.111cn.net/sys/linux/55152.htm
- DRF-自动生成接口文档
REST framework可以自动帮助我们生成接口文档. 接口文档以网页的方式呈现. 自动接口文档能生成的是继承自APIView及其子类的视图. 1. 安装依赖 REST framewrok生成接口 ...
- python ajax post 数据
简单的html <div> <input type="submit" id="tes" value="tes"> & ...
- Django的缓存机制和信号量相关
缓存介绍 缓存的简介 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面. 当一个网站的用户访问量很大的时候,每一次的的后台操作 ...
- php多台服务器实现session共享
使用Redis存储Session(前提是服务期间已实现redis共享,可参照:laravel项目使用twemproxy部署redis集群) 修改php.ini: session.save_handle ...
- tomcat并发优化
配置参考 <Connector port="9027" protocol="HTTP/1.1" maxHttpHeaderSize="8192& ...
- 简单的curl抓取数据
工欲善其事,必先利其器,数据抓取同样也是如此,PHP数据抓取常用CURL. CURL是一个使用libcurl库与各类服务器进行通讯,支持很多协议,如HTTP.FTP.TELNET等. curl_ini ...