阿里云
阿里云多端小程序中小企业获客首选
发表主题 回复主题
  • 41848阅读
  • 22回复

[免费公测]【阿里云产品公测】结构化数据服务OTS之JavaSDK初体验

级别: 程序猿
发帖
257
云币
1277

SDK 来访问OTS这个产品不好写啊,太专业了……

来投票支持我把

序号2、 【阿里产品公测】云引擎ACE初体验;作者:蓝色之鹰

序号10、【阿里云产品公测】结构化数据服务OTS之JavaSDK初体验;作者:蓝色之鹰

http://bbs.aliyun.com/read/178799.html

                          


一、OTS简单介绍

OTS 是构建在阿里云飞天分布式系统之上的NoSQL数据库服务,提供海量结构化数据的存储和实时访问。NoSQL,泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。OTS应用程序可以使用阿里云官方发布的OTS SDK 来访问OTS,也可以通过POST 方法发送HTTP 请求来访问OTS。

关于http请求访问请参考API

本文将介绍SDK访问OTS。

.

.

.

二、准备工作

  1. 结构化数据服务 OTS 公测资格申请;
  2.        参见OTS申请流程  

  3. SDK下载;

    Java SDK下载地址:

    http://oss.aliyuncs.com/aliyun_portal_storage/help/ots/aliyun-openservices-OTS-2.0.4.zip?spm=5176.383723.9.10.yXCDUV&file=aliyun-openservices-OTS-2.0.4.zip

    OSS和OTS SDK可实现maven中央库调用(2012年10月10日起实现)

    Open Services SDK for Java包含了OSS和OTS的SDK,之前一直只在阿里云官方网站上以zip包的形式提供下载链接。用户只能手动下载使用。但在Java世界里,maven已经成为开发者依赖的代码库管理工具,将SDK发布到maven中央库可以方便开发者使用我们的SDK。现在SDK已经在Maven中央库发布成功!今后开发者可以直接在其项目中使用maven -> add dependency来引用我们的SDK了。

  4. Access Key创建

.

.

.

三、安装部署

本人使用的IDE是MyEclipse,这个随便找己习惯的IDE

  1. SDK包结构
  2. 需要说下的是,这个SDK包里默认包含了OTS和OSS;安装和使用基本上都差不多,有兴趣的同学,可以都体验下!

  3. 引入工程
  4. 代码:将examples下的com目录拷贝到项目Src下

    JAR包:将aliyun-openservices-OTS-2.0.4.jar和lib目录下的jar包引入工程;

  5. 编码设置
  6. 将项目编码设置为:UTF-8

  7. 目录展示

四、测试使用

  1. 创建实例
  2. 登录阿里管理控制台,进入OTS管理控制台创建实例

          2、修改参数

         测试类:OTSSingleDataSample

  1. public static void main(String args[]) {
  2.         final String endPoint = "<your endpoint>"; //http开头+公网访问域名,如:http://myotstest.cn-hangzhou.ots.aliyuncs.com
  3.         final String accessId = "<your access id>";
  4.         final String accessKey = "<your access key>";
  5.         final String instanceName = "<your instance name>";//实例名
  6. //以上四个参数替换请把<>也替换掉

运行java程序

结果:

  1. 表已创建
  2. 成功插入数据, 消耗的写CapacityUnit为:1
  3. 本次读操作消耗的读CapacityUnti为:1
  4. name信息:张三:STRING
  5. address信息:中国A地:STRING
  6. age信息:20:INTEGER
  7. 成功更新数据, 消耗的写CapacityUnit为:1
  8. 成功删除数据, 消耗的写CapacityUnit为:1
  9. 表已删除

五、代码分享

    

    main方法

  1. public static void main(String args[]) {
  2.         final String endPoint = "<your endpoint>";
  3.         final String accessId = "<your access id>";
  4.         final String accessKey = "<your access key>";
  5.         final String instanceName = "<your instance name>";
  6.         
  7.         OTSClient client = new OTSClient(endPoint, accessId, accessKey, instanceName);
  8.         final String tableName = "sampleTable";
  9.         try{
  10.             // 创建表
  11.             createTable(client, tableName);
  12.             // 注意:创建表只是提交请求,OTS创建表需要一段时间。
  13.             // 这里简单地等待30秒,请根据您的实际逻辑修改。
  14.             Thread.sleep(30000);
  15.             // 插入一条数据。
  16.             putRow(client, tableName);
  17.             // 再取回来看看。
  18.             getRow(client, tableName);
  19.             // 改一下这条数据。
  20.             updateRow(client, tableName);
  21.             // 删除这条数据。
  22.             deleteRow(client, tableName);
  23.         }catch(ServiceException e){
  24.             System.err.println("操作失败,详情:" + e.getMessage());
  25.             // 可以根据错误代码做出处理, OTS的ErrorCode定义在OTSErrorCode中。
  26.             if (OTSErrorCode.QUOTA_EXHAUSTED.equals(e.getErrorCode())){
  27.                 System.err.println("超出存储配额。");
  28.             }
  29.             // Request ID可以用于有问题时联系客服诊断异常。
  30.             System.err.println("Request ID:" + e.getRequestId());
  31.         }catch(ClientException e){
  32.             // 可能是网络不好或者是返回结果有问题
  33.             System.err.println("请求失败,详情:" + e.getMessage());
  34.         } catch (InterruptedException e) {
  35.             System.err.println(e.getMessage());
  36.         }
  37.         finally{
  38.             // 不留垃圾。
  39.             try {
  40.                 deleteTable(client, tableName);
  41.             } catch (ServiceException e) {
  42.                 System.err.println("删除表格失败,原因:" + e.getMessage());
  43.                 e.printStackTrace();
  44.             } catch (ClientException e) {
  45.                 System.err.println("删除表格请求失败,原因:" + e.getMessage());
  46.                 e.printStackTrace();
  47.             }
  48.         }
  49.     }

这里完成了下面几个动作

a、创建表

b、简单地等待30秒

c、插入一条数据

d、再取回来看看

e、修改这条数据

f、删除这条数据

g、最后删除表

创建表的方法

  1. private static void createTable(OTSClient client, String tableName)
  2.             throws ServiceException, ClientException{
  3.         TableMeta tableMeta = new TableMeta(tableName);
  4.         tableMeta.addPrimaryKeyColumn(COLUMN_GID_NAME, PrimaryKeyType.INTEGER);
  5.         tableMeta.addPrimaryKeyColumn(COLUMN_UID_NAME, PrimaryKeyType.INTEGER);
  6.         // 将该表的读写CU都设置为100
  7.         CapacityUnit capacityUnit = new CapacityUnit(100, 100);
  8.         CreateTableRequest request = new CreateTableRequest();
  9.         request.setTableMeta(tableMeta);
  10.         request.setReservedThroughput(capacityUnit);
  11.         client.createTable(request);
  12.         System.out.println("表已创建");
  13.     }

插入行的方法

  1. private static void putRow(OTSClient client, String tableName)
  2.             throws ServiceException, ClientException{
  3.         RowPutChange rowChange = new RowPutChange(tableName);
  4.         RowPrimaryKey primaryKey = new RowPrimaryKey();
  5.         primaryKey.addPrimaryKeyColumn(COLUMN_GID_NAME, PrimaryKeyValue.fromLong(1));
  6.         primaryKey.addPrimaryKeyColumn(COLUMN_UID_NAME, PrimaryKeyValue.fromLong(101));
  7.         rowChange.setPrimaryKey(primaryKey);
  8.         rowChange.addAttributeColumn(COLUMN_NAME_NAME, ColumnValue.fromString("张三"));
  9.         rowChange.addAttributeColumn(COLUMN_MOBILE_NAME, ColumnValue.fromString("111111111"));
  10.         rowChange.addAttributeColumn(COLUMN_ADDRESS_NAME, ColumnValue.fromString("中国A地"));
  11.         rowChange.addAttributeColumn(COLUMN_AGE_NAME, ColumnValue.fromLong(20));
  12.         rowChange.setCondition(new Condition(RowExistenceExpectation.EXPECT_NOT_EXIST));
  13.         
  14.         PutRowRequest request = new PutRowRequest();
  15.         request.setRowChange(rowChange);
  16.         PutRowResult result = client.putRow(request);
  17.         int consumedWriteCU = result.getConsumedCapacity().getCapacityUnit().getWriteCapacityUnit();
  18.         System.out.println("成功插入数据, 消耗的写CapacityUnit为:" + consumedWriteCU);
  19.     }

获取行的方法

  1. private static void getRow(OTSClient client, String tableName)
  2.             throws ServiceException, ClientException{
  3.         SingleRowQueryCriteria criteria = new SingleRowQueryCriteria(tableName);
  4.         RowPrimaryKey primaryKeys = new RowPrimaryKey();
  5.         primaryKeys.addPrimaryKeyColumn(COLUMN_GID_NAME, PrimaryKeyValue.fromLong(1));
  6.         primaryKeys.addPrimaryKeyColumn(COLUMN_UID_NAME, PrimaryKeyValue.fromLong(101));
  7.         criteria.setPrimaryKey(primaryKeys);
  8.         criteria.addColumnsToGet(new String[] {
  9.                 COLUMN_NAME_NAME,
  10.                 COLUMN_ADDRESS_NAME,
  11.                 COLUMN_AGE_NAME
  12.         });
  13.         GetRowRequest request = new GetRowRequest();
  14.         request.setRowQueryCriteria(criteria);
  15.         GetRowResult result = client.getRow(request);
  16.         Row row = result.getRow();
  17.         
  18.         int consumedReadCU = result.getConsumedCapacity().getCapacityUnit().getReadCapacityUnit();
  19.         System.out.println("本次读操作消耗的读CapacityUnti为:" + consumedReadCU);
  20.         System.out.println("name信息:" + row.getColumns().get(COLUMN_NAME_NAME));
  21.         System.out.println("address信息:" + row.getColumns().get(COLUMN_ADDRESS_NAME));
  22.         System.out.println("age信息:" + row.getColumns().get(COLUMN_AGE_NAME));
  23.     }

更新行的方法

  1. private static void updateRow(OTSClient client, String tableName)
  2.             throws ServiceException, ClientException{
  3.         RowUpdateChange rowChange = new RowUpdateChange(tableName);
  4.         RowPrimaryKey primaryKeys = new RowPrimaryKey();
  5.         primaryKeys.addPrimaryKeyColumn(COLUMN_GID_NAME, PrimaryKeyValue.fromLong(1));
  6.         primaryKeys.addPrimaryKeyColumn(COLUMN_UID_NAME, PrimaryKeyValue.fromLong(101));
  7.         rowChange.setPrimaryKey(primaryKeys);
  8.         // 更新以下三列的值
  9.         rowChange.addAttributeColumn(COLUMN_NAME_NAME, ColumnValue.fromString("张三"));
  10.         rowChange.addAttributeColumn(COLUMN_ADDRESS_NAME, ColumnValue.fromString("中国B地"));
  11.         // 删除mobile和age信息
  12.         rowChange.deleteAttributeColumn(COLUMN_MOBILE_NAME);
  13.         rowChange.deleteAttributeColumn(COLUMN_AGE_NAME);
  14.         
  15.         rowChange.setCondition(new Condition(RowExistenceExpectation.EXPECT_EXIST));
  16.         
  17.         UpdateRowRequest request = new UpdateRowRequest();
  18.         request.setRowChange(rowChange);
  19.         UpdateRowResult result = client.updateRow(request);
  20.         int consumedWriteCU = result.getConsumedCapacity().getCapacityUnit().getWriteCapacityUnit();
  21.         System.out.println("成功更新数据, 消耗的写CapacityUnit为:" + consumedWriteCU);
  22.     }

删除行的方法

  1. private static void deleteRow(OTSClient client, String tableName)
  2.             throws ServiceException, ClientException{
  3.         RowDeleteChange rowChange = new RowDeleteChange(tableName);
  4.         RowPrimaryKey primaryKeys = new RowPrimaryKey();
  5.         primaryKeys.addPrimaryKeyColumn(COLUMN_GID_NAME, PrimaryKeyValue.fromLong(1));
  6.         primaryKeys.addPrimaryKeyColumn(COLUMN_UID_NAME, PrimaryKeyValue.fromLong(101));
  7.         rowChange.setPrimaryKey(primaryKeys);
  8.         
  9.         DeleteRowRequest request = new DeleteRowRequest();
  10.         request.setRowChange(rowChange);
  11.         DeleteRowResult result = client.deleteRow(request);
  12.         int consumedWriteCU = result.getConsumedCapacity().getCapacityUnit().getWriteCapacityUnit();
  13.         System.out.println("成功删除数据, 消耗的写CapacityUnit为:" + consumedWriteCU);
  14.     }

删除表的方法

  1. private static void deleteTable(OTSClient client, String tableName)
  2.             throws ServiceException, ClientException{
  3.         DeleteTableRequest request = new DeleteTableRequest();
  4.         request.setTableName(tableName);
  5.         client.deleteTable(request);
  6.         System.out.println("表已删除");
  7.     }

五、测试体会

OTS 使用还是很简单方便的。

基本的稳定和安全还是有保证的。

1、系统可用性99.9%,自动故障检测与恢复;

2、用户级别的数据隔离、访问控制和权限管理,用户只能访问有权限的表,数据冗余备份;

ots 主要的优势还是在于大数据量方面,单表百TB级别数据存储,毫秒级别单行读写延迟,十万级别QPS。

稍后带来更深入的测试……

    


来投票支持我把

序号2、 【阿里云产品公测】云引擎ACE初体验;作者:蓝色之鹰

序号10、【阿里云产品公测】结构化数据服务OTS之JavaSDK初体验;作者:蓝色之鹰

http://bbs.aliyun.com/read/178799.html

[ 此帖被qiujin2012在2014-10-13 13:31重新编辑 ]
本帖最近评分记录: 2 条评分 云币 +21
啊里新人 云币 +1 我想问一下你使用的老的sdk么,新的没有看到在哪里下载 2014-10-17
qiujin2012 云币 +20 支持他,就给他投票,猛戳: http://bbs.aliyun.com/read/178799.html 2014-10-10
级别: 程序猿
发帖
257
云币
1277

只看该作者 沙发  发表于: 2014-10-09
Re【阿里云产品公测】结构化数据服务OTS之JavaSDK初体验
回复:阿里新人,我文章里有JDK的下载地址,你仔细看看!
[ 此帖被蓝色之鹰在2014-10-24 22:54重新编辑 ]
本帖最近评分记录: 1 条评分 云币 +1
啊里新人 云币 +1 你是我偶像 2014-11-08
级别: 研究猿
发帖
3357
云币
4596

只看该作者 板凳  发表于: 2014-10-09
不错。有机会测评一下这个,不过现在没空了
本帖最近评分记录: 1 条评分 云币 +1
蓝色之鹰 云币 +1 您是资深工程师了啊 2014-11-01
发帖
994
云币
1363
只看该作者 地板  发表于: 2014-10-09
不错 p/]s)uYp$  
支持他,就给他投票,猛戳: Qu~*46?0  
http://bbs.aliyun.com/read/178799.html
〉〉论坛经验-《阿里云服务器从入门到精通》精华汇总
http://bbs.aliyun.com/read/135619.html?amp;displayMode=1#tpc
级别: 程序猿
发帖
257
云币
1277

只看该作者 4楼 发表于: 2014-10-10
Re【阿里云产品公测】结构化数据服务OTS之JavaSDK初体验
来投票支持我把 "=A|K~b  
c$#GM57V  
http://bbs.aliyun.com/read/178799.html &|=?a cv  
J~dTVBx  
作者:蓝色之鹰
级别: 新人
发帖
16
云币
30
只看该作者 5楼 发表于: 2014-10-10
Re【阿里云产品公测】结构化数据服务OTS之JavaSDK初体验
看着挺高大上的
本帖最近评分记录: 1 条评分 云币 +1
蓝色之鹰 云币 +1 谢谢回复,来给我投票吧 2014-11-01
级别: 小白
发帖
21
云币
41
只看该作者 6楼 发表于: 2014-10-10
Re【阿里云产品公测】结构化数据服务OTS之JavaSDK初体验
JAVA的接口对PHP的程序 来说 真心是很痛苦的 。
级别: 程序猿
发帖
257
云币
1277

只看该作者 7楼 发表于: 2014-10-11
回6楼cxtuku的帖子
可使用HTTP请求,访问OTS的!
级别: 研究猿
发帖
3357
云币
4596

只看该作者 8楼 发表于: 2014-10-11
     我也喜欢使用sdk省劲啊。。哈哈哈
级别: 研究猿
发帖
3357
云币
4596

只看该作者 9楼 发表于: 2014-10-11
回 6楼(cxtuku) 的帖子
应该是有对应api的,http协议不区分语言的,只是没有现成sdk方便
级别: 程序猿
发帖
257
云币
1277

只看该作者 10楼 发表于: 2014-10-15
Re【阿里云产品公测】结构化数据服务OTS之JavaSDK初体验
还有人吗?
级别: 研究猿
发帖
3357
云币
4596

只看该作者 11楼 发表于: 2014-10-17
我想问一下你使用的老的sdk么,新的没有看到在哪里下载
级别: 程序猿
发帖
257
云币
1277

只看该作者 12楼 发表于: 2014-10-27
回11楼啊里新人的帖子
我文章里有连接啊
本帖最近评分记录: 1 条评分 云币 +1
啊里新人 云币 +1 你懂的! 2014-11-07
级别: 研究猿
发帖
3357
云币
4596

只看该作者 13楼 发表于: 2014-10-28
操作失败,详情:Signature mismatch. -;.fU44O[#  
Request ID:00050672-90bc-78ad-0788-990a7d24ed5d B>L^XGq  
删除表格失败,原因:Signature mismatch. #!j&L6  
[Error Code]:OTSAuthFailed, [Message]:Signature mismatch. a' fb0fz  
    at com.aliyun.openservices.ots.internal.OTSExceptionFactory.create(OTSExceptionFactory.java:28) gz:c_HJ  
    at com.aliyun.openservices.ots.internal.OTSErrorResponseHandler.handle(OTSErrorResponseHandler.java:60) Dp'af4+%$  
    at com.aliyun.common.comm.ServiceClient.handleResponse(ServiceClient.java:284) @d9*<>@:  
    at com.aliyun.common.comm.ServiceClient.sendRequestImpl(ServiceClient.java:177) ?Ir6*ZyY  
    at com.aliyun.common.comm.ServiceClient.sendRequest(ServiceClient.java:136) fkG"72 95A  
    at com.aliyun.common.comm.ServiceClient.sendRequest(ServiceClient.java:109) Ase1R=0  
    at com.aliyun.openservices.ots.internal.OTSOperation.invoke(OTSOperation.java:59) 1fG@r%4  
    at com.aliyun.openservices.ots.internal.OTSTableOperation.deleteTable(OTSTableOperation.java:94) j+v)I=  
    at com.aliyun.openservices.ots.OTSClient.deleteTable(OTSClient.java:206) J sdEA  
    at com.aliyun.openservices.ots.examples.OTSMultiDataSample.deleteTable(OTSMultiDataSample.java:105) TJa%zi  
    at com.aliyun.openservices.ots.examples.OTSMultiDataSample.main(OTSMultiDataSample.java:74) ~$ Yuxo  
p{u}t!`!d  
wOSNlbQ5jl  
java sdk直接报错。这个是什么原因呢
级别: 程序猿
发帖
257
云币
1277

只看该作者 14楼 发表于: 2014-10-29
回13楼啊里新人的帖子
OTSAuthFailed AS398L  
你的KEY 错了吧
本帖最近评分记录: 1 条评分 云币 +1
啊里新人 云币 +1 你知道的太多啦 2014-11-02
发表主题 回复主题
« 返回列表
«12»
共2页
上一主题下一主题

限100 字节
批量上传需要先选择文件,再选择上传
 
验证问题: ECS是阿里云提供的什么服务? 正确答案:云服务器
上一个 下一个
      ×
      全新阿里云开发者社区, 去探索开发者的新世界吧!
      一站式的体验,更多的精彩!
      通过下面领域大门,一起探索新的技术世界吧~ (点击图标进入)