林炳文Evankaka原创作品。转载请注明出处http://blog.csdn.net/evankaka

摘要:IBM® Data Cache for Bluemix 是快速缓存服务。支持 Web 和移动应用程序的分布式快速缓存场景。快速缓存服务使用数据网格 技术,您能够在当中存储键值对象。Data Cache 提供了一个业务就绪的内存数据网格 (IMDG)。其将数据放在接近逻辑的位置并随着业务扩展仍将其保留在此。非常easy使用并扩展现有应用程序的性能和可伸缩性。它能够帮助将冗余事务降到最低、提高响应时间并添加现有应用程序基础结构(支持重要应用程序)中的效率。对于添加的冗余。Data Cache 提供快速缓存中存储的数据副本。因此,万一掉线或停运,客户机应用程序仍可訪问快速缓存中的数据。

本文实例訪问:http://datacachetest.eu-gb.mybluemix.net/

BluxMix账号注冊:https://apps.admin.ibmcloud.com/manage/trial/bluemix.html?

cm_mmc=CMDeveloperGCG-_-Bluemix-_-CSDN-_-onlineeventQ2

一、创建project并加入Data Cache服务

1、Bluemix个人中心创建projectwebproject

怎样创建project可看基于IBM Bluemix部署Java Web项目实战演练,这时创建后的project

2、加入Data Cache 服务

Data Cache 服务在远程利用数据网格的快速缓存功能并使您能够执行创建、检索、更新和删除操作。

能够进入到项目中,然后点击加入服务或API,然后搜索data,找到Data Cache就可以。

选择主要的套餐:

二、创建本地Java webproject

最后整个project文件夹例如以下:

1、创建一个Dynamic web Project

2、加入jar包

WebContent/WEB-INF/lib 文件夹加入ogclient.jar 、json-org.jar

这两个jar包下载地址,ftp://public.dhe.ibm.com/cloud/bluemix/datacache/

3、创建连接Data cache的代码

要使用 Data Cache 服务实例。可在 VCAP_SERVICES 环境变量中找到应用程序与服务实例进行通信所需的不论什么数据。您的应用程序须要包括所需的变量。以与 Data Cache 服务进行通信。

您能通过包括以下代码片段,以编程方式从 VCAP_SERVICES 环境变量获取变量 gridName、username 和 password,并放入代码。此代码片段将读取 VCAP_SERVICES 环境变量:

以下的代码放在本地eclipse是无法执行的,它得上传到Bluemixproject中才干够执行

public void jspInit() {
Map<String, String> env = System.getenv();//取得bluemix的当前project
String vcap=env.get("VCAP_SERVICES");//取得环境变量 String username=null;
String password=null;
String endpoint=null;
String gridName=null; boolean foundService=false;
if(vcap==null) {
System.out.println("No VCAP_SERVICES found");
} else {
try {
JSONObject obj = new JSONObject(vcap);
String[] names=JSONObject.getNames(obj);
if (names!=null) {
for (String name:names) {
if (name.startsWith("DataCache")) { //取得缓存API
JSONArray val = obj.getJSONArray(name);
JSONObject serviceAttr = val.getJSONObject(0);
JSONObject credentials = serviceAttr.getJSONObject("credentials");
username = credentials.getString("username");
password = credentials.getString("password");
endpoint=credentials.getString("catalogEndPoint");
gridName= credentials.getString("gridName");
System.out.println("Found configured username: " + username);
System.out.println("Found configured password: " + password);
System.out.println("Found configured endpoint: " + endpoint);
System.out.println("Found configured gridname: " + gridName);
foundService = true;
break;
}
}
}
} catch(Exception e) {}
} if(!foundService) {
System.out.println("Did not find WXS service, using defaults");
} try { ObjectGridManager ogm = ObjectGridManagerFactory.getObjectGridManager();
ClientSecurityConfiguration csc=null;
csc=ClientSecurityConfigurationFactory.getClientSecurityConfiguration();
csc.setCredentialGenerator(new UserPasswordCredentialGenerator(username,password));
csc.setSecurityEnabled(true); ClientClusterContext ccc = ogm.connect(endpoint, csc, null); ObjectGrid clientGrid = ogm.getObjectGrid(ccc, gridName);
ogSession = clientGrid.getSession(); } catch(Exception e) {
System.out.println("Failed to connect to grid!");
e.printStackTrace();
}
}

事实上取得的环境变量在界面上例如以下

4、创建增、取、删除缓存的代码

ObjectMap map=ogSession.getMap("mymap.NONE.P");
map.upsert("key1", "value1");
Object value = map.get("key1");
map.remove("key1");

5、合并代码

由于这里我们要实现的是从前台缓存数据,取数据等。所以后台就要实现将前台传过来的数据缓存。为此。能够将上面的代码合并使用。

新建一个.jsp文件例如以下:

dataCache.jsp

<%@ page pageEncoding="UTF-8"%>
<%@ page import="java.util.Map" %>
<%@ page import="org.json.JSONArray" %>
<%@ page import="org.json.JSONException" %>
<%@ page import="org.json.JSONObject" %>
<%@ page import="com.ibm.websphere.objectgrid.*" %>
<%@ page import="com.ibm.websphere.objectgrid.security.config.*" %>
<%@ page import="com.ibm.websphere.objectgrid.security.plugins.builtins.*" %>
<%!
Session ogSession; public void jspInit() {
Map<String, String> env = System.getenv();//取得bluemix的当前project
String vcap=env.get("VCAP_SERVICES");//取得环境变量 String username=null;
String password=null;
String endpoint=null;
String gridName=null; boolean foundService=false;
if(vcap==null) {
System.out.println("No VCAP_SERVICES found");
} else {
try {
JSONObject obj = new JSONObject(vcap);
String[] names=JSONObject.getNames(obj);
if (names!=null) {
for (String name:names) {
if (name.startsWith("DataCache")) { //取得缓存API
JSONArray val = obj.getJSONArray(name);
JSONObject serviceAttr = val.getJSONObject(0);
JSONObject credentials = serviceAttr.getJSONObject("credentials");
username = credentials.getString("username");
password = credentials.getString("password");
endpoint=credentials.getString("catalogEndPoint");
gridName= credentials.getString("gridName");
System.out.println("Found configured username: " + username);
System.out.println("Found configured password: " + password);
System.out.println("Found configured endpoint: " + endpoint);
System.out.println("Found configured gridname: " + gridName);
foundService = true;
break;
}
}
}
} catch(Exception e) {}
} if(!foundService) {
System.out.println("Did not find WXS service, using defaults");
} try { ObjectGridManager ogm = ObjectGridManagerFactory.getObjectGridManager();
ClientSecurityConfiguration csc=null;
csc=ClientSecurityConfigurationFactory.getClientSecurityConfiguration();
csc.setCredentialGenerator(new UserPasswordCredentialGenerator(username,password));
csc.setSecurityEnabled(true); ClientClusterContext ccc = ogm.connect(endpoint, csc, null); ObjectGrid clientGrid = ogm.getObjectGrid(ccc, gridName);
ogSession = clientGrid.getSession(); } catch(Exception e) {
System.out.println("Failed to connect to grid!");
e.printStackTrace();
}
}
%> <%
try {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/plain");
response.setCharacterEncoding("UTF-8"); ///ObjectMap用来存储缓存内容
ObjectMap map=ogSession.getMap("sample.NONE.P"); String key = request.getParameter("key");
String operation=request.getParameter("operation");
Object retrievedValue;
if("get".equals(operation)) { //取得缓存内容
retrievedValue=map.get(key);
response.getWriter().write(retrievedValue==null?"null":retrievedValue.toString()); } else if("put".equals(operation)) { //存储缓存内容
String newValue = request.getParameter("value");
map.upsert(key,newValue);//能够对map实现update or insert
response.getWriter().write("[PUT]"); } else if("delete".equals(operation)) { //删除缓存
map.remove(key);
response.getWriter().write("[DELETED]");
} } catch(Exception e) {
System.out.println("Failed to perform operation on map");
e.printStackTrace();
}
%>

6、编写前台页面代码

这里前台使用ajax请求(不懂ajax可看这里Ajax实例解说与技术原理)到dataCache.jsp文件去缓存数据、取数据、删除数据。整个代码例如以下:

index.html

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>IBM Bluemix缓存实例</title>
<body onload="load()">
<script language="javascript" type="text/javascript">
function load(){
document.getElementById('get').addEventListener("click", getClicked, false);
document.getElementById('put').addEventListener("click", putClicked, false);
document.getElementById('delete').addEventListener("click", deleteClicked, false);
}
//发送请求
function sendRequest(operation) {
var ajaxRequest;
var key = encodeURIComponent(document.getElementById('key').value);
var value = encodeURIComponent(document.getElementById('value').value); ajaxRequest = new XMLHttpRequest();
ajaxRequest.onreadystatechange = function(){
if(ajaxRequest.readyState == 4){
var result = ajaxRequest.responseText;
document.getElementById('value').value=result;
}
}
//发送ajax的get请求
ajaxRequest.open("GET", "dataCache.jsp?operation="+operation+"&key="+key+"&value="+value, true);
ajaxRequest.send(null);
}
//取得缓存
function getClicked() {
sendRequest('get');
}
//存储缓存
function putClicked() {
sendRequest('put');
}
//删除缓存
function deleteClicked() {
sendRequest('delete');
}
</script>
<h3>IBM Bluemix缓存实例:</h3>
Key:   <input id="key" type='text' name='key' /> <br>
Value:  <input id='value' type="text" name='value' /><br><br>
<button id='get'>依据KEY取缓存内容</button>
<button id='put'>存储缓存内容</button>
<button id='delete'>依据KEY删除缓存内容</button><br> </body>
</html>

7、本地启动tomcat执行一下

确认页面显示没问题
这里你怎样输入数据。点击肯定会出问题,由于还没有部署到Bluxmix:
例如以下错误:

三、打包与公布到Bluemix

1、打包本地war包。
直接在Eclipse中使用
然后选择文件夹:
看看最后的结果:
注意:也可使用控制台下进行项目文件夹。然后输入
// 将当前文件夹打包成war包
jar cvf DataCacheTest.war */ .

只是,这种方法最后打包的war包笔者上传后启动失败了。

所以不建议使用这种方法。

2、上传war包到个人Bluemix中心
(1)、登陆
cf login
输入用户名、密码、选择工作空间
或者 直接cf login-u ling20081005@126.com -o ling20081005@126.com -s 工作空间名

邮箱记得换成您自己的。

(2)、上传war包

cf push DataCacheTest-p D:\DataCacheTest.war -m 512M
记得要指定空间大小512M
最后假设显演示样例如以下:
说明上传成功且执行成功

四、验证效果

输入内容,点击存储缓存内容
注意。最后显演示样例如以下才表示缓存存储成功,要稍稍等下(server毕竟在美国,速度返回会比較慢),显示put了才表示成功!

当然,你也能够看日志:
比方上面的存储缓存的
日志在这里来看:
还有就是取缓存的:
页面上输入key。然后点击取缓存的按钮
删除缓存:
页面上输入key,然后点击删除缓存的按钮

五、监视 IBM Data Cache for Bluemix

以下是bluxmix提供的用于监视Data Cache的工具
在将应用程序连接到 Data Cache 之后。您能够监视 Web 应用程序的快速缓存使用情况。单击 IBM Bluemix 仪表板的服务实例,以为您的应用程序显示图表。注意。得绑定服务,并启动程序后才会显示此内容!

已用空间
此图表包括基于 IBM 的服务计划的快速缓存容量总计的视图。

显示的容量总计包括数据网格中存储的数据的 1 个副本。您能够通过为您应用程序购买很多其它容量。一直添加限制。

吞吐量
此图表是 5 分钟内吞吐量的快照视图。您能够将此图表展开为更大的视图。显示 1 小时的吞吐量。
事务时间
此图表是 5 分钟内事务时间的快照视图。其以每毫秒的事务度量。您能够将此图表展开为更大的视图,显示 1 小时的事务时间。

命中率
此图表是快速缓存命中率的快照视图。

您能够将此图表展开为更大的视图。显示 1 小时的命中率。

六、遇到的问题

遇到的问题:
project第一次上传部署上去的时候。

尝试訪问部署的应用程序时,打开网址,笔者出现了以下消息:

404 Not Found:Requested route ('guesstheword.mybluemix.net') does not exist.
这似乎不正确劲。显然某处存在问题,并且这个问题似乎与在 Bluemix 上执行的应用程序相关,由于该应用程序能够在本地正常执行。

解决方法:
删除bluxmix上的project。又一次加入服务。然后又一次打包本地war包(最好通过eclipse 的expot方法)。最后再又一次上传就可以!

基于IBM Bluemix的数据缓存应用实例的更多相关文章

  1. SpringMVC + ehcache( ehcache-spring-annotations)基于注解的服务器端数据缓存

    背景 声明,如果你不关心java缓存解决方案的全貌,只是急着解决问题,请略过背景部分. 在互联网应用中,由于并发量比传统的企业级应用会高出很多,所以处理大并发的问题就显得尤为重要.在硬件资源一定的情况 ...

  2. cache应用(asp.net 2.0 SQL数据缓存依赖 [SqlCacheDependency ] )

    Asp.net 2.0 提供了一个新的数据缓存功能,就是利用sql server2005 的异步通知功能来实现缓存 1.首先在sqlserver2005 中创建一个test的数据库. 在SQL Ser ...

  3. SQL数据缓存依赖 [SqlServer | Cache | SqlCacheDependency ]

    前言 本文主要是对<ASP.NET 2.0开发指南>——<数据缓存>章节内容的提取并略有补充. 参考资料 1.     <ASP.NET 2.0开发指南> 2.   ...

  4. SQL SERVER 2000 & SQL SERVER 2005 数据缓存依赖

    一.SQL SERVER 7.0/2000和SQL SERVER 2005的简介及比较 1.1     SQL SERVER 7.0/2000 SQL SERVER 7.0/2000没有提供内置的支持 ...

  5. Memcached 数据缓存系统

    Memcached 数据缓存系统 常用命令及使用:http://www.cnblogs.com/wayne173/p/5652034.html Memcached是一个自由开源的,高性能,分布式内存对 ...

  6. jQuery源码解读 - 数据缓存系统:jQuery.data

    jQuery在1.2后引入jQuery.data(数据缓存系统),主要的作用是让一组自定义的数据可以DOM元素相关联——浅显的说:就是让一个对象和一组数据一对一的关联. 一组和Element相关的数据 ...

  7. jQuery1.9.1源码分析--数据缓存Data模块

    jQuery1.9.1源码分析--数据缓存Data模块 阅读目录 jQuery API中Data的基本使用方法介绍 jQuery.acceptData(elem)源码分析 jQuery.data(el ...

  8. jQuery源代码学习之六——jQuery数据缓存Data

    一.jQuery数据缓存基本原理 jQuery数据缓存就两个全局Data对象,data_user以及data_priv; 这两个对象分别用于缓存用户自定义数据和内部数据: 以data_user为例,所 ...

  9. 使用SQLite做本地数据缓存的思考

    前言 在一个分布式缓存遍地都是的环境下,还讲本地缓存,感觉有点out了啊!可能大家看到标题,就没有想继续看下去的欲望了吧.但是,本地缓存的重要性也是有的! 本地缓存相比分布式缓存确实是比较out和比较 ...

随机推荐

  1. js 对象的创建方式和对象的区别

    js一个有三种方法创建对象,这里做一个总结. 1.对象直接量 所谓对象直接量,可以看做是一副映射表,这个方法也是最直接的一个方法,个人比较建议, 1 2 3 4 5 6 7 8 9 10 11 12 ...

  2. Spring Security中的MD5盐值加密

    在 spring Security 文档中有这么一句话: "盐值的原理非常简单,就是先把密码和盐值指定的内容合并在一起,再使用md5对合并后的内容进行演算,这样一来,就算密码是一个很常见的字 ...

  3. Html 播放 mp4格式视频提示 没有发现支持的视频格式和mime类型

    转自原文 Html 播放 mp4格式视频提示 没有发现支持的视频格式和mime类型 播放mp4格式的时候提示 Html 播放 mp4格式视频提示 没有发现支持的视频格式和mime类型 原因是在IIS中 ...

  4. HDU 5358 First One(枚举)

    First One Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Tota ...

  5. Spring25大面试题

    1.什么是Spring框架?Spring框架有哪些主要模块? Spring框架是一个为Java应用程序的开发提供了综合.广泛的基础性支持的Java平台.Spring帮助开发人员攻克了开发中基础性的问题 ...

  6. HttpClient get和HttpClient Post请求的方式获取服务器的返回数据

    1.转自:https://blog.csdn.net/alinshen/article/details/78221567?utm_source=blogxgwz4 /*  * 演示通过HttpClie ...

  7. 搞笑OI

    OI难 噫吁嚱,维护难哉!OI之难,难于上青天!哈希及DP,代码何茫然!尔来一千两百A,不见金牌背后难.西当华师有考场,可以横绝CN巅.编译不过壮士死,然后超时爆内存相钩连.上有自主招生之高标,下有由 ...

  8. Codeforces 676E The Last Fight Between Human and AI 规律

    链接 Codeforces 676E The Last Fight Between Human and AI 题意 给一个多项式,有些系数不确定.人和机器轮流填系数,系数可以是任何数,问是否能使得最后 ...

  9. spring boot integrated mybatis three ways!--转

    https://github.com/spring-projects/spring-boot/issues/5400 一.使用mybatis-spring-boot-starter1.添加依赖 org ...

  10. avalon过滤

    <html xmlns="http://www.w3.org/1999/xhtml"><head runat="server">    ...