【阿里云产品公测】结构化数据服务OTS之JavaSDK初体验
作者:阿里云用户蓝色之鹰
一、OTS简单介绍
OTS 是构建在阿里云飞天分布式系统之上的NoSQL数据库服务,提供海量结构化数据的存储和实时访问。NoSQL,泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。OTS应用程序可以使用阿里云官方发布的OTS SDK 来访问OTS,也可以通过POST 方法发送HTTP 请求来访问OTS。
关于http请求访问请参考API
本文将介绍SDK访问OTS。
二、准备工作
1、结构化数据服务 OTS 公测资格申请;参见OTS申请流程
2、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了。
3、Access Key创建
三、安装部署
本人使用的IDE是MyEclipse,这个随便找自己习惯的IDE
-
SDK包结构
需要说下的是,这个SDK包里默认包含了OTS和OSS;安装和使用基本上都差不多,有兴趣的同学,可以都体验下!
2、引入工程
代码:将examples下的com目录拷贝到项目Src下
JAR包:将aliyun-openservices-OTS-2.0.4.jar和lib目录下的jar包引入工程;
3、编码设置
将项目编码设置为:UTF-8
4、目录展示
四、测试使用
-
创建实例
登录阿里管理控制台,进入OTS管理控制台创建实例
2、修改参数
测试类:OTSSingleDataSample
-
public static void main(String args[]) {
-
final String endPoint = "<your endpoint>"; //http开头+公网访问域名,如:http://myotstest.cn-hangzhou.ots.aliyuncs.com
-
final String accessId = "<your access id>";
-
final String accessKey = "<your access key>";
-
final String instanceName = "<your instance name>";//实例名
-
//以上四个参数替换请把<>也替换掉
-
运行java程序
结果:
-
表已创建
-
成功插入数据, 消耗的写CapacityUnit为:1
-
本次读操作消耗的读CapacityUnti为:1
-
name信息:张三:STRING
-
address信息:中国A地:STRING
-
age信息:20:INTEGER
-
成功更新数据, 消耗的写CapacityUnit为:1
-
成功删除数据, 消耗的写CapacityUnit为:1
-
表已删除
五、代码分享
main方法
-
public static void main(String args[]) {
-
final String endPoint = "<your endpoint>";
-
final String accessId = "<your access id>";
-
final String accessKey = "<your access key>";
-
final String instanceName = "<your instance name>";
-
-
OTSClient client = new OTSClient(endPoint, accessId, accessKey, instanceName);
-
final String tableName = "sampleTable";
-
try{
-
// 创建表
-
createTable(client, tableName);
-
// 注意:创建表只是提交请求,OTS创建表需要一段时间。
-
// 这里简单地等待30秒,请根据您的实际逻辑修改。
-
Thread.sleep(30000);
-
// 插入一条数据。
-
putRow(client, tableName);
-
// 再取回来看看。
-
getRow(client, tableName);
-
// 改一下这条数据。
-
updateRow(client, tableName);
-
// 删除这条数据。
-
deleteRow(client, tableName);
-
}catch(ServiceException e){
-
System.err.println("操作失败,详情:" + e.getMessage());
-
// 可以根据错误代码做出处理, OTS的ErrorCode定义在OTSErrorCode中。
-
if (OTSErrorCode.QUOTA_EXHAUSTED.equals(e.getErrorCode())){
-
System.err.println("超出存储配额。");
-
}
-
// Request ID可以用于有问题时联系客服诊断异常。
-
System.err.println("Request ID:" + e.getRequestId());
-
}catch(ClientException e){
-
// 可能是网络不好或者是返回结果有问题
-
System.err.println("请求失败,详情:" + e.getMessage());
-
} catch (InterruptedException e) {
-
System.err.println(e.getMessage());
-
}
-
finally{
-
// 不留垃圾。
-
try {
-
deleteTable(client, tableName);
-
} catch (ServiceException e) {
-
System.err.println("删除表格失败,原因:" + e.getMessage());
-
e.printStackTrace();
-
} catch (ClientException e) {
-
System.err.println("删除表格请求失败,原因:" + e.getMessage());
-
e.printStackTrace();
-
}
-
}
-
}
这里完成了下面几个动作
a、创建表
b、简单地等待30秒
c、插入一条数据
d、再取回来看看
e、修改这条数据
f、删除这条数据
g、最后删除表
创建表的方法
-
private static void createTable(OTSClient client, String tableName)
-
throws ServiceException, ClientException{
-
TableMeta tableMeta = new TableMeta(tableName);
-
tableMeta.addPrimaryKeyColumn(COLUMN_GID_NAME, PrimaryKeyType.INTEGER);
-
tableMeta.addPrimaryKeyColumn(COLUMN_UID_NAME, PrimaryKeyType.INTEGER);
-
// 将该表的读写CU都设置为100
-
CapacityUnit capacityUnit = new CapacityUnit(100, 100);
-
CreateTableRequest request = new CreateTableRequest();
-
request.setTableMeta(tableMeta);
-
request.setReservedThroughput(capacityUnit);
-
client.createTable(request);
-
System.out.println("表已创建");
-
}
插入行的方法
-
private static void putRow(OTSClient client, String tableName)
-
throws ServiceException, ClientException{
-
RowPutChange rowChange = new RowPutChange(tableName);
-
RowPrimaryKey primaryKey = new RowPrimaryKey();
-
primaryKey.addPrimaryKeyColumn(COLUMN_GID_NAME, PrimaryKeyValue.fromLong(1));
-
primaryKey.addPrimaryKeyColumn(COLUMN_UID_NAME, PrimaryKeyValue.fromLong(101));
-
rowChange.setPrimaryKey(primaryKey);
-
rowChange.addAttributeColumn(COLUMN_NAME_NAME, ColumnValue.fromString("张三"));
-
rowChange.addAttributeColumn(COLUMN_MOBILE_NAME, ColumnValue.fromString("111111111"));
-
rowChange.addAttributeColumn(COLUMN_ADDRESS_NAME, ColumnValue.fromString("中国A地"));
-
rowChange.addAttributeColumn(COLUMN_AGE_NAME, ColumnValue.fromLong(20));
-
rowChange.setCondition(new Condition(RowExistenceExpectation.EXPECT_NOT_EXIST));
-
-
PutRowRequest request = new PutRowRequest();
-
request.setRowChange(rowChange);
-
PutRowResult result = client.putRow(request);
-
int consumedWriteCU = result.getConsumedCapacity().getCapacityUnit().getWriteCapacityUnit();
-
System.out.println("成功插入数据, 消耗的写CapacityUnit为:" + consumedWriteCU);
-
}
获取行的方法
-
private static void getRow(OTSClient client, String tableName)
-
throws ServiceException, ClientException{
-
SingleRowQueryCriteria criteria = new SingleRowQueryCriteria(tableName);
-
RowPrimaryKey primaryKeys = new RowPrimaryKey();
-
primaryKeys.addPrimaryKeyColumn(COLUMN_GID_NAME, PrimaryKeyValue.fromLong(1));
-
primaryKeys.addPrimaryKeyColumn(COLUMN_UID_NAME, PrimaryKeyValue.fromLong(101));
-
criteria.setPrimaryKey(primaryKeys);
-
criteria.addColumnsToGet(new String[] {
-
COLUMN_NAME_NAME,
-
COLUMN_ADDRESS_NAME,
-
COLUMN_AGE_NAME
-
});
-
GetRowRequest request = new GetRowRequest();
-
request.setRowQueryCriteria(criteria);
-
GetRowResult result = client.getRow(request);
-
Row row = result.getRow();
-
-
int consumedReadCU = result.getConsumedCapacity().getCapacityUnit().getReadCapacityUnit();
-
System.out.println("本次读操作消耗的读CapacityUnti为:" + consumedReadCU);
-
System.out.println("name信息:" + row.getColumns().get(COLUMN_NAME_NAME));
-
System.out.println("address信息:" + row.getColumns().get(COLUMN_ADDRESS_NAME));
-
System.out.println("age信息:" + row.getColumns().get(COLUMN_AGE_NAME));
-
}
更新行的方法
-
private static void updateRow(OTSClient client, String tableName)
-
throws ServiceException, ClientException{
-
RowUpdateChange rowChange = new RowUpdateChange(tableName);
-
RowPrimaryKey primaryKeys = new RowPrimaryKey();
-
primaryKeys.addPrimaryKeyColumn(COLUMN_GID_NAME, PrimaryKeyValue.fromLong(1));
-
primaryKeys.addPrimaryKeyColumn(COLUMN_UID_NAME, PrimaryKeyValue.fromLong(101));
-
rowChange.setPrimaryKey(primaryKeys);
-
// 更新以下三列的值
-
rowChange.addAttributeColumn(COLUMN_NAME_NAME, ColumnValue.fromString("张三"));
-
rowChange.addAttributeColumn(COLUMN_ADDRESS_NAME, ColumnValue.fromString("中国B地"));
-
// 删除mobile和age信息
-
rowChange.deleteAttributeColumn(COLUMN_MOBILE_NAME);
-
rowChange.deleteAttributeColumn(COLUMN_AGE_NAME);
-
-
rowChange.setCondition(new Condition(RowExistenceExpectation.EXPECT_EXIST));
-
-
UpdateRowRequest request = new UpdateRowRequest();
-
request.setRowChange(rowChange);
-
UpdateRowResult result = client.updateRow(request);
-
int consumedWriteCU = result.getConsumedCapacity().getCapacityUnit().getWriteCapacityUnit();
-
System.out.println("成功更新数据, 消耗的写CapacityUnit为:" + consumedWriteCU);
-
}
删除行的方法
-
private static void deleteRow(OTSClient client, String tableName)
-
throws ServiceException, ClientException{
-
RowDeleteChange rowChange = new RowDeleteChange(tableName);
-
RowPrimaryKey primaryKeys = new RowPrimaryKey();
-
primaryKeys.addPrimaryKeyColumn(COLUMN_GID_NAME, PrimaryKeyValue.fromLong(1));
-
primaryKeys.addPrimaryKeyColumn(COLUMN_UID_NAME, PrimaryKeyValue.fromLong(101));
-
rowChange.setPrimaryKey(primaryKeys);
-
-
DeleteRowRequest request = new DeleteRowRequest();
-
request.setRowChange(rowChange);
-
DeleteRowResult result = client.deleteRow(request);
-
int consumedWriteCU = result.getConsumedCapacity().getCapacityUnit().getWriteCapacityUnit();
-
System.out.println("成功删除数据, 消耗的写CapacityUnit为:" + consumedWriteCU);
-
}
删除表的方法
-
private static void deleteTable(OTSClient client, String tableName)
-
throws ServiceException, ClientException{
-
DeleteTableRequest request = new DeleteTableRequest();
-
request.setTableName(tableName);
-
client.deleteTable(request);
-
System.out.println("表已删除");
-
}
五、测试体会
OTS 使用还是很简单方便的,基本的稳定和安全还是有保证的。
1、系统可用性99.9%,自动故障检测与恢复;
2、用户级别的数据隔离、访问控制和权限管理,用户只能访问有权限的表,数据冗余备份;
3、ots 主要的优势还是在于大数据量方面,单表百TB级别数据存储,毫秒级别单行读写延迟,十万级别QPS。
原文地址:http://bbs.aliyun.com/read/178870.html
微博互动:http://weibo.com/1644971875/BrlU9CYNQ
参加活动:http://promotion.aliyun.com/act/aliyun/freebeta/