林炳文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. 楼宇自控-RS232\RS485\RS422

    1.rs-232-c rs-232-c是美国电子工业协会eia(electronic industry association)制定的一种串行物理接口标准.rs是英文"推荐标准"的 ...

  2. WinServer-IIS初始安装及发布网站

    \aspnet_regiis.exe –i 还有非常重要的一步就是给发布文件夹设置权限,到底设置那一个用户的权限我也没有弄清楚,大概是IIS_IUSERS或者IUSR用户就可以了,我设置完了之后没有反 ...

  3. 洛谷 P1894 [USACO4.2]完美的牛栏The Perfect Stall

    P1894 [USACO4.2]完美的牛栏The Perfect Stall 题目描述 农夫约翰上个星期刚刚建好了他的新牛棚,他使用了最新的挤奶技术.不幸的是,由于工程问题,每个牛栏都不一样.第一个星 ...

  4. linux svn命令具体解释

    检測是否安装svn:svnserve --version svn服务的关闭:killall svnserve 创建svn库:svnadmin create /opt/svn/repos 配置自己主动启 ...

  5. crm操作报价单实体

    using System;     using Microsoft.Xrm.Sdk;     using Microsoft.Crm.Sdk.Messages;     using Microsoft ...

  6. Qt Quick 简单介绍

    Qt Quick 是 Qt 提供的一种高级用户界面技术.使用它可轻松地为移动和嵌入式设备创建流畅的用户界面. 在 Android 设备上, Qt Quick 应用默认使用 OpenGL ES ,渲染效 ...

  7. VC 下加载 JPG / JPEG / GIF / PNG 图片最简单的方法

    VC MFC 提供的 API LoadBitmap / LoadImage 类 CBitmap 等都只能操作 BMP 位图,图标.对于其他常用的 JPG / JPEG / GIF / PNG 格式,它 ...

  8. 【算法】第二类斯特林数Stirling

    第二类Stirling数实际上是集合的一个拆分,表示将n个不同的元素拆分成m个集合的方案数,记为 或者 . 第二类Stirling数的推导和第一类Stirling数类似,可以从定义出发考虑第n+1个元 ...

  9. JOSN快速入门

    1.JSON介绍 (1)JSON是一种与开发语言无关的,轻量级的数据格式,全称 JavaScript Object  Notation,易于阅读和编写,语言解析和生产 (2)JSON数据类型表示 数据 ...

  10. HTML基础——网站首页显示页面

    1.表格标签: border设置边框,align设置位置(居中等),bgcolor设置背景颜色,cellspacing设置边框之间的空隙,cellpadding设置边框与里面内容的间距. table表 ...