將Oracle作為NoSQL文件儲存

jelephant發表於2016-12-09

使用Java編寫透過SODASimple 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的文件

import  java.sql.Connection;

import  java.sql.DriverManager;

import  oracle.soda.rdbms.OracleRDBMSClient;

import  oracle.soda.OracleDatabase;

import  oracle.soda.OracleCursor;

import  oracle.soda.OracleCollection;

import  oracle.soda.OracleDocument;

import  oracle.soda.OracleException;

import  java.util.Properties;

import  oracle.jdbc.OracleConnection;

 

public  class  testSODA {

  public  static  void  main(String[] args) {

    // 設定連線字串,注意根據實際連線修改

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

    Properties props =new Properties();

    // 設定資料庫使用者名稱和密碼,注意根據實際連線修改

    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 =new OracleRDBMSClient();

        // 獲取資料庫

        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{$ gte300}}

        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.jarSODA 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()

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29337971/viewspace-2130197/,如需轉載,請註明出處,否則將追究法律責任。

相關文章