NoSQL专题

CouchDB的安装使用教程

  Apache CouchDB通常简称为CouchDB的,是一个开放源码的数据库,侧重于易用性和完全拥抱网络"数据库"。 这是一个NoSQL数据库,使用JSON来存储数据,使用JavaScript作为它的查询语言,内部使用MapReduce和HTTP API。 其显着特点之一是多主复制。CouchDB数据库没有schema,或刚性预定义的数据结构如数据表。在CouchDB存储的数据是一个JSON文档。可以动态变化,以适应不断变化的需求。 CouchDB中还提供了一个内置的管理界面,通过Web访问称为Futon。

特点:

  1. 文件存储:
    CouchDB将数据存储为文件,一个或多个字段/值对的JSON,字段值可以是简单如字符串,数字或日期,但有序列表和关联数组也可以使用。一个CouchDB数据库中每一个文件都有唯一ID ,没有必要的Schema。
  2. ACID语义:
    CouchDB提供ACID语义。它通过实施某种形式的多版本并行控制,这意味着CouchDB可以处理大量并发读者和作家没有冲突。
  3. Map / Reduce的视图和索引:
    存储的数据使用视图作为结构。在CouchDB中,每个视图是一个JavaScript函数作为Map构建,这个Map是Map/reduce的Map。函数取得一个文件,并把它转换成一个单一的值并返回。 CouchDB可以索引视图,并保持更新这些索引,当文件添加,删除或更新时。
  4. 使用复制的分布式架构:
    CouchDB的设计采用双向复制(或同步)和脱机操作。这意味着相同数据数据有多个副本,对其进行修改时,在以后的时间这些修改会同步。
  5. REST API :
    所有项目都有一个唯一的URI会通过HTTP暴露。 REST使用HTTP方法POST , GET , PUT和DELETE的四个基本的CRUD (创建,读取,更新,删除)操作上的所有资源。
  6. 最终一致性:
    CouchDB的保证最终一致性,能够提供可用性和分区容忍性。
  7. 内置离线:
    CouchDB可以复制到设备(如智能手机)脱机处理数据同步时,该设备为您重新联机。
  8. 免费模式:
    CouchDB是与SQL数据库,其目的是为了在高度结构化的,相互关联的数据存储和报告,设计大量半结构化的,面向文档的数据存储和报告。 CouchDB的面向文档的应用程序,如协作Web应用程序大大简化了开发。

 

Ubuntu安装

sudo apt-get install couchdb -y

sudo chown -R couchdb /var/run/couchdb

配置:

sudo dpkg --configure couchdb

http://127.0.0.1:5984/_utils/index.html运行检验

Java客户端

  • Ektorp
  • JRelax
  • jcouchdb
  • DroidCouch
  • CouchDB4J
  • LightCouch

以CouchDB4J 为案例:

所需要的包如下:

 

package com.couchdb.demo;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.util.List;

import java.util.Map;

import org.apache.http.HttpEntity;

import org.apache.http.HttpResponse;

import org.apache.http.client.ClientProtocolException;

import org.apache.http.client.methods.HttpGet;

import org.apache.http.impl.client.DefaultHttpClient;

import org.json.simple.JSONValue;

import com.fourspaces.couchdb.Database;

import com.fourspaces.couchdb.Document;

import com.fourspaces.couchdb.Session;

import com.fourspaces.couchdb.ViewResults;

public class CouchDBCompleteDemo {

   static Session dbSession ;

   static Database db;

   public static void main(String[] args) {

       String dbName = "foodb";

       createDatabase(dbName);

       saveDocument(getDocument("1", "Willian", "J2EECOE", "TL", "Android"));

       saveDocument(getDocument("2", "Joanne", "J2EECOE", "Developer", "Java"));

       saveDocument(getDocument("3", "suzzane", "J2EECOE", "Sr. Developer", "Java"));

       saveDocument(getDocument("4", "Harley", "J2EECOE", "Sr. Developer", "Java"));

       saveDocument(getDocument("5", "Julian", "J2EECOE", "Developer", "Java"));

       saveDocument(getDocument("6", "Peter", "J2EECOE", "Developer", "Java"));

       getTotalDocumentCount();

       viewAllDocuments();

       viewsDemo();

//        deleteDocument("6");

//        getTotalDocumentCount();

//        deleteDatabase(dbName);

   }

   public static void createDatabase(String dbName){

       dbSession = new Session("localhost", 5984);

       db = dbSession.createDatabase(dbName);

       if(db==null)

           db = dbSession.getDatabase(dbName);

   }

   public static Document getDocument(String id,String name,String group,String designation,String language){

       Document doc = new Document();

       doc.setId(id);

       doc.put("EmpNO", id);

       doc.put("Name", name);

       doc.put("Group", group);

       doc.put("Designation", designation);

       doc.put("Language", language);

       return doc;

   }

   public static void saveDocument(Document doc){

       try {

           db.saveDocument(doc);

       } catch (Exception e) {

       }

   }

   public static int getTotalDocumentCount(){

       int count = db.getDocumentCount();

       System.out.println("Total Documents: " + count);

       return count;

   }

   public static void deleteDocument(String id){

       Document d = db.getDocument(id);

       System.out.println("Document 1: " + d);

       db.deleteDocument(d);

   }

   public static void deleteDatabase(String dbName){

       dbSession.deleteDatabase(dbName);

   }

   public static void viewAllDocuments(){

       ViewResults results = db.getAllDocuments();

       List<Document> documentsList = results.getResults();

       if(documentsList!=null)

       {

           for(Document doc : documentsList)

           {

               System.out.println(doc.get("id") + " : " +  doc);

           }

       }

   }

   public static void viewsDemo(){

       if(db!=null)

       {

Document doc = null;

           try {

               doc = db.getDocument("_design/couchview");

           } catch (Exception e1) {

               doc = null;

           }

           try {

               if(doc==null)

               {

                   doc = new Document();

                   doc.setId("_design/couchview");

                   String str = "{\"javalanguage\": {\"map\": \"function(doc) { if (doc.Language == 'Java')  emit(null, doc) } \"}, \"java_and_se\": {\"map\": \"function(doc) { if (doc.Language == 'Java' & doc.Designation == 'SE')  emit(null, doc) } \"}}";

                   doc.put("views", str);

                   db.saveDocument(doc);

               }

           } catch (Exception e) {

           }

       }

       try {

           DefaultHttpClient httpclient = new DefaultHttpClient();

           HttpGet get = new HttpGet("http://localhost:5984/foodb/_design/couchview/_view/javalanguage");

           HttpResponse response = httpclient.execute(get);

           HttpEntity entity=response.getEntity();

           InputStream instream = entity.getContent();

           BufferedReader reader = new BufferedReader(new InputStreamReader(instream));

           String strdata = null;

           String jsonString = "" ;

           while( (strdata =reader.readLine())!=null)

           {

//                   System.out.println(strdata);

                  jsonString += strdata;

           }

           System.out.println("Json String: " + jsonString);

           Map<String, Object> jsonMap = getMapFromJsonString(jsonString);

           if(jsonMap!=null)

           {

               System.out.println("total_rows: " + jsonMap.get("total_rows"));

               System.out.println("offset: " + jsonMap.get("offset"));

               List<Map> rowsList = (List<Map>) jsonMap.get("rows");

               if(rowsList!=null)

               {

                   for(Map row: rowsList)

                   {

                       System.out.println("----------------");

                       System.out.println("Id: " + row.get("id"));

                       System.out.println("Value: " + row.get("value"));

                       System.out.println("Name: " + ((Map)row.get("value")).get("Name"));

                       System.out.println("_id: " + ((Map)row.get("value")).get("_id"));

                       System.out.println("Language: " + ((Map)row.get("value")).get("Language"));

                       System.out.println("EmpNO: " + ((Map)row.get("value")).get("EmpNO"));

                       System.out.println("Designation: " + ((Map)row.get("value")).get("Designation"));

                       System.out.println("Group: " + ((Map)row.get("value")).get("Group"));

                   }

               }

           }

       } catch (ClientProtocolException e) {

           e.printStackTrace();

       } catch (IllegalStateException e) {

           e.printStackTrace();

       } catch (IOException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       }   

   }

   public static Map<String, Object> getMapFromJsonString(String jsonString){

       Map<String, Object> jsonMap = (Map<String, Object>) JSONValue.parse(jsonString);

       System.out.println("Json Map: " + jsonMap);

       return jsonMap;

   }
}