oracle跟nosql,将Oracle作为NoSQL文档存储

使用Java编写通过SODA(Simple Oracle Document Access)在Oracle数据库中使用JSON(而不仅仅是JSON!)。SODA允许您的Java应用程序使用Oracle数据库作为NoSQL文档存储。

首先,要确保有一个Oracle 12.1.0.2实例,并且应用补丁20885778(注:并不是数据库所有版本都适用)。

可以通过My Oracle Support()搜索补丁编号,20885778或直接访问此URL:/rs?type=patch&id=20885778。并确保遵循README.txt文件中指定的所有安装步骤进行安装。

给用户授予SODA_APP权限(注:根据实际情况修改schemaName):

grant  SODA_APP  to  schemaName;

以下通过Java程序演示SODA的几个常用操作:

1.创建新集合

2.将文档插入到集合中

3.通过其自动生成的键检索第一个插入的文档

4.检索匹配查询示例或QBE的文档

importjava.sql.Connection;

importjava.sql.DriverManager;

importoracle.soda.rdbms.OracleRDBMSClient;

importoracle.soda.OracleDatabase;

importoracle.soda.OracleCursor;

importoracle.soda.OracleCollection;

importoracle.soda.OracleDocument;

importoracle.soda.OracleException;

importjava.util.Properties;

importoracle.jdbc.OracleConnection;

public  classtestSODA{

public  static  voidmain(String[]args) {

//设置连接字符串,注意根据实际连接修改

String url="jdbc:oracle:thin:@//hostName:port/serviceName";

Properties props=newProperties();

//设置数据库用户名和密码,注意根据实际连接修改

props.setProperty("user","schemaName");

props.setProperty("password","password");

OracleConnection conn=null;

try{

//获取到Oracle实例的JDBC连接

conn=(OracleConnection) DriverManager.getConnection(url, props);

//启用JDBC隐式语句高速缓存

conn.setImplicitCachingEnabled(true);

conn.setStatementCacheSize(50);

//获取OracleRDBMSClient – SODA的起点

OracleRDBMSClient cl=newOracleRDBMSClient();

//获取数据库

OracleDatabase db=cl.getDatabase(conn);

//创建名为"MyFirstJSONCollection"的集合.

//注意:集合名称区分大小写。

//在RDBMS中创建名称为“MyFirstJSONCollection”的表来存储集合

OracleCollection col=db.admin().createCollection("MyFirstJSONCollection");

//创建几个JSON文档,表示用户和用户有多少个朋友

OracleDocument doc1=

db.createDocumentFromString(

"{ \"name\" : \"Alex\",\"friends\" : \"50\" }");

OracleDocument doc2=

db.createDocumentFromString(

"{ \"name\" : \"Mia\",\"friends\" : \"300\" }");

OracleDocument doc3=

db.createDocumentFromString(

"{ \"name\" : \"Gloria\",\"friends\" : \"399\" }");

//将文档逐个插入到集合中。

//注:SODA还提供了更高效的批量插入

OracleDocument resultDoc1=col.insertAndGet(doc1);

OracleDocument resultDoc2=col.insertAndGet(doc2);

OracleDocument resultDoc3=col.insertAndGet(doc3);

//使用其自动生成的唯一ID(即密钥)检索第一个文档

System.out.println ("*通过唯一KEY检索第一个文档*\n");

OracleDocument fetchedDoc=col.find().key(resultDoc1.getKey()).getOne();

System.out.println (fetchedDoc.getContentAsString());

//检索代表至少有300位朋友的用户的文档。使用以下查询示例:{friends:{$ gte:300}}。

System.out.println ("\n*检索代表至少有300位朋友的用户的文档*\n");

OracleDocument f=db.createDocumentFromString(

"{ \"friends\" : { \"$gte\": 300 }}");

OracleCursor c=null;

try{

//获取游标

c=col.find().filter(f).getCursor();

while(c.hasNext()) {

//获取下一个文档

fetchedDoc=c.next();

System.out.println (fetchedDoc.getContentAsString());

}

}

finally{

//必须关闭光标释放资源

if(c!=null) {

c.close();

}

}

//删除集合

if(args.length>0&&args[0].equals("drop")) {

col.admin().drop();

System.out.println ("\n*集合被删除*");

}

}

catch(Exception e) {

e.printStackTrace();

}

finally{

if(conn!=null) {

try{

conn.close();

}

catch(Exception e) {

}

}

}

}

}

注意修改程序开头的“url”字符串。此外,在程序开头设置的“用户”和“密码”属性需要根据实际情况修改。

此外,编译运行此程序还需要以下jar包:

1.Oracle数据库12.1.0.2附带的ojdbc6.jar。从这里下载:

2.javax.json-1.0.4.jar。这是JSR353实现,从这里下载:

3.orajsoda-version.jar。SODA jar,在这里下载:

编译并运行testSODA.java,确保必要的jar在类路径中。执行以下操作:

javac-classpath "orajsoda.jar" testSODA.java

java-classpath "orajsoda-version.jar:ojdbc6.jar:javax.json-1.0.4.jar:."testSODA

您应该看到以下输出:

*通过唯一KEY检索第一个文档*

{"name" : "Alex", "friends" : "50" }

*检索代表至少有300位朋友的用户的文档*

{"name" : "Mia", "friends" : "300" }

{"name" : "Gloria", "friends" : "399" }

此示例使用了集合检索文档的两种方法:使用唯一KEY键或使用QBE。在上面的代码中查找所有至少有300个朋友的用户使用了以下QBE:

{"friends": {"$gte" : 300}}

如你所见,QBE是一个JSON格式字符串,其结构类似于它试图匹配的JSON文档。各种操作符可以出现在QBE内部。示例中,$ gte运算符用于查找“friends”字段设置为大于或等于300的所有文档。

要检出支持此集合的表,可以使用SQLPlus或其他类似工具连接到上述示例中相关用户下,并执行:

SQL>desc "MyFirstJSONCollection"

Name                                     Null?    Type

------------------------------------------------- ----------------------------

ID                                        NOTNULL VARCHAR2(255)

CREATED_ON                                NOT NULL TIMESTAMP(6)

LAST_MODIFIED                             NOT NULLTIMESTAMP(6)

VERSION                                   NOT NULLVARCHAR2(255)

JSON_DOCUMENT                                      BLOB

正如您所看到的,已经创建了一个包含以下列的表:

ID                   Stores the auto-generatedkey

JSON_DOCUMENT        Stores the document content

CREATED_ON           Stores the auto-generated created-ontimestamp

LAST_MODIFIED        Stores the auto-generated last-modifiedtimestamp

VERSION              Stores the auto-generateddocument version

此表模式使用的是默认集合配置,但SODA集合是高度可配置的。例如,时间戳和版本列是可选的,有许多可能的方法来生成ID或版本等。

要删除集合,删除基础表并清理数据库中持久保存的元数据,请再次运行示例,但这次在最后的参数中使用“drop”参数:

java-classpath "orajsoda.jar:ojdbc6-12.1.0.2.0.jar:javax.json-1.0.4.jar:."testSODA drop

现在的输出与前面的输出不同,因为将再次插入相同的三个文档。但是,最后,集合将被删除,并删除基础表。

注意:不要从SQL中删除集合表。集合具有存储在Oracle RDBMS中的元数据,因此必须使用drop()方法正确删除。参见代码中的:col.admin().drop()。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值