基于IBM Bluemix的数据缓存应用实例

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

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

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

BluxMix账号注册:https://apps.admin.ibmcloud.com/manage/trial/bluemix.html?cm_mmc=CMDeveloperGCG-_-Bluemix-_-CSDN-_-onlineeventQ2

一、创建工程并添加Data Cache服务

1、Bluemix个人中心创建工程web工程

如何创建工程可看基于IBM Bluemix部署Java Web项目实战演练,这时创建后的工程

2、添加Data Cache 服务

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

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

选择基本的套餐:

二、创建本地Java web工程

最后整个工程目录如下:

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是无法运行的,它得上传到Bluemix工程中才可以运行

public void jspInit() {
 		Map<String, String> env = System.getenv();//取得bluemix的当前工程
 		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的当前工程
 		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 [email protected] -o [email protected] -s 工作空间名

邮箱记得换成您自己的。

(2)、上传war包

cf push DataCacheTest-p D:\DataCacheTest.war -m 512M
记得要指定空间大小512M

最后如果显示如下:

说明上传成功且运行成功

四、验证效果

输入网址:http://datacachetest.eu-gb.mybluemix.net/

输入内容,点击存储缓存内容

注意,最后显示如下才表示缓存存储成功,要稍稍等下(服务器毕竟在美国,速度返回会比较慢),显示put了才表示成功!

当然,你也可以看日志:

比如上面的存储缓存的

日志在这里来看:

还有就是取缓存的:

页面上输入key,然后点击取缓存的按钮

删除缓存:

页面上输入key,然后点击删除缓存的按钮

五、监视 IBM Data Cache for Bluemix

下面是bluxmix提供的用于监视Data Cache的工具

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

已用空间
此图表包含基于 IBM 的服务计划的高速缓存容量总计的视图。显示的容量总计包括数据网格中存储的数据的 1 个副本。您可以通过为您应用程序购买更多容量,一直增加限制。

吞吐量
此图表是 5 分钟内吞吐量的快照视图。您可以将此图表展开为更大的视图,显示 1 小时的吞吐量。

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

命中率
此图表是高速缓存命中率的快照视图。您可以将此图表展开为更大的视图,显示 1 小时的命中率。

六、遇到的问题

遇到的问题:

工程第一次上传部署上去的时候。尝试访问部署的应用程序时,打开网址,笔者出现了以下消息:

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

解决方法:

删除bluxmix上的工程,重新添加服务。然后重新打包本地war包(最好通过eclipse 的expot方法)。最后再重新上传即可!

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

时间: 2024-08-02 19:09:14

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

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

背景 声明,如果你不关心java缓存解决方案的全貌,只是急着解决问题,请略过背景部分. 在互联网应用中,由于并发量比传统的企业级应用会高出很多,所以处理大并发的问题就显得尤为重要.在硬件资源一定的情况下,在软件层面上解决高并发问题会比较经济实惠一些.解决并发的根本在于提高系统的响应时间与单位时间的吞吐量.解决问题的思路可分两个维度,一是提高系统的单位时间内的运算效率(比如集群),二是减少系统不必要的开支(比如缓存).缓存又会分为客户端缓存与服务器端缓存,本文就javaEE项目的服务器端缓存方案展

基于IBM Bluemix部署Java Web项目实战演练

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文主要介绍了IBM Bluemix,并详细说明了如何部署Java Web项目,如何添加MySql服务.最后,提出了自己的一些看法.  文章目录 一.Bluemix简单介绍 二.BlueMix空间申请试用 三.BlueMix创建Cloud Foundry应用 四.添加新的服务 五.总结 一.Bluemix 简单介绍 1.Bluemix 带来了什么        Bluemix 致力于解

基于IBM Bluemix的Docker实践教程

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文开始简单介绍了Docker以及IBM Bluemix,接下来阐述了如何通过Ubuntu14.04操作系统来配置IBM Bluemix的Docker容器与镜像的操作环境,并演示了在本地操作镜像push到Bluemix中并创建运行容器输出结果和在Bluemix上一些Docker相关命令操作. 操作系统: Ubuntu14.04 一.需要的准备工作 1.注册一个Bluemix账号 2.对

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

Asp.net 2.0 提供了一个新的数据缓存功能,就是利用sql server2005 的异步通知功能来实现缓存 1.首先在sqlserver2005 中创建一个test的数据库. 在SQL Server 2005上执行 ALTER DATABASE <DatabaseName> SET ENABLE_BROKER;语句让相应的数据库启用监听服务,以便支持SqlDependency特性. 添加一个 employee的数据库表. 1CREATETABLE[dbo].[employee](2[i

基于Java LinkedList,实现Android大数据缓存策略

import java.util.HashMap; import java.util.LinkedList; /* * 基于Java LinkedList,实现Android大数据缓存策略 * 作者:Zhang Phil * 原文出处:http://blog.csdn.net/zhangphil * * 实现原理:原理的模型认为:在LinkedList的头部元素是最旧的缓存数据,在LinkedList的尾部是最新的缓存数据. * 在一个LinkedList(类型C的链表)维护一个存储堆栈,添加元

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

一.jQuery数据缓存基本原理 jQuery数据缓存就两个全局Data对象,data_user以及data_priv; 这两个对象分别用于缓存用户自定义数据和内部数据: 以data_user为例,所有用户自定义数据都被保存在这个对象的cache属性下,cache在此姑且称之为自定义数据缓存: 自定义数据缓存和DOM元素/javascript对象通过id建立关联,id的查找通过DOM元素/javascript元素下挂载的expando属性获得 话不多说,直接上代码.相关思路在代码注释中都有讲解

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

阅读目录 jQuery API中Data的基本使用方法介绍 jQuery.acceptData(elem)源码分析 jQuery.data(elem, name, data)源码分析 internalRemoveData方法源码分析 internalData方法的源码分析 jQuery.fn.extend({data: function( key, value ) {}})源码分析 jQuery.extend({removeData: function( elem, name ) {}})源码分

IBM的大数据云江湖,谁是新盟主?

大家都知道,在传统IT时代,数据库三巨头有IBM.Oracle和微软.在三巨头中,IBM可以说是绝对的数据库巨头,1968年就研发出了世界上第一个层次型数据库管理系统IMS,1970年IBM专家首次提出了数据关系模型的概念,1974年又提出了一种新型的数据查询语言也就是后来SQL的前身,1983年IBM发布了著名的DB2数据库,2001年以10亿美金收购了Informix. 然而到了云计算和大数据时代,一时风云变化.Hadoop和Spark等开源大数据存储与处理技术的崛起,导致了全球数据库市场格

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

jQuery在1.2后引入jQuery.data(数据缓存系统),主要的作用是让一组自定义的数据可以DOM元素相关联——浅显的说:就是让一个对象和一组数据一对一的关联. 一组和Element相关的数据如何关联着这个Element一直是web前端的大姨妈,而最初的jQuery事件系统照搬Dean Edwards的addEvent.js:将回调挂载在EventTarget上,这样下来,循环引用是不可忽视的问题.而在web前端中,数据和DOM的关系太过基情和紧张,于是jQuery在1.2中,正式缔造了