Thursday, 11 July 2013






Introduction


  • Apache CouchDB, commonly referred to as CouchDB, is an open source database that focuses on ease of use and on being "a database that completely embraces the web".
  • It is a NoSQL database that uses JSON to store data, JavaScript as its query language using MapReduce and HTTP for an API.
  • One of its distinguishing features is multi-master replication.
  • Couch is an acronym for cluster of unreliable commodity hardware
  • A CouchDB database lacks a schema, or rigid pre-defined data structures such as tables. Data stored in CouchDB is a JSON document(s).
  • The structure of the data, or document(s), can change dynamically to accommodate evolving needs.
  • CouchDB also offers a built-in administration interface accessible via web called Futon.

Main features



  • Document Storage:
    • CouchDB stores data as "documents", as one or more field/value pairs expressed as JSON. Field values can be simple things like strings, numbers, or dates; but ordered lists and associative arrays can also be used. Every document in a CouchDB database has a unique id and there is no required document schema.


  • ACID Semantics:
    • CouchDB provides ACID semantics. It does this by implementing a form of Multi-Version Concurrency Control, meaning that CouchDB can handle a high volume of concurrent readers and writers without conflict.


  • Map/Reduce Views and Indexes:
    • The stored data is structured using views. In CouchDB, each view is constructed by a JavaScript function that acts as the Map half of a map/reduce operation. The function takes a document and transforms it into a single value which it returns. CouchDB can index views and keep those indexes updated as documents are added, removed, or updated.


  • Distributed Architecture with Replication:
    • CouchDB was designed with bi-direction replication (or synchronization) and off-line operation in mind. That means multiple replicas can have their own copies of the same data, modify it, and then sync those changes at a later time.


  • REST API:
    • All items have a unique URI that gets exposed via HTTP. REST uses the HTTP methods POST, GET, PUT and DELETE for the four basic CRUD (Create, Read, Update, Delete) operations on all resources.


  • Eventual Consistency:
    • CouchDB guarantees eventual consistency to be able to provide both availability and partition tolerance.


  • Built for Offline:
    • CouchDB can replicate to devices (like smartphones) that can go offline and handle data sync for you when the device is back online.


  • Schema-Free:
    • Unlike SQL databases, which are designed to store and report on highly structured, interrelated data, CouchDB is designed to store and report on large amounts of semi-structured, document oriented data. CouchDB greatly simplifies the development of document oriented applications, such as collaborative web applications.
    • In an SQL database, the schema and storage of the existing data must be updated as needs evolve. With CouchDB, no schema is required, so new document types with new meaning can be safely added alongside the old. However, for applications requiring robust validation of new documents custom validation functions are possible. The view engine is designed to easily handle new document types and disparate but similar documents.


Installation (Ubuntu)



  • Open terminal and execute
sudo apt-get install couchdb -y


  • If the aptitude/apt-get installation gives an error message then couchdb might not have access to its pid file.


  • Fix:
sudo chown -R couchdb /var/run/couchdb
  • Need to rerun the setup script:
sudo dpkg --configure couchdb




For Verifying CouchDB, check on Futon: http://127.0.0.1:5984/_utils/index.html

*For installation on other Operating Systems - http://wiki.apache.org/couchdb/Installation


CouchDB Java Client



  • Ektorp


  • JRelax


  • jcouchdb


  • DroidCouch


  • CouchDB4J


  • LightCouch



CouchDB4J Example



  • CouchDB4J is an updated Java library for CouchDB.
  • It handles the REST style calls to the CouchDB server behind the scenes, and give you a handle on the JSON objects directly.
  • CouchDB4J uses JSON-lib to handle mapping to/from JSON objects, which makes getting/setting properties on the objects very easy.
  • You can even map Java objects to JSON objects and back to make the process easier.
  • Example:


Structure:


CouchDBCompleteDemo.java



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;

   }
}
Categories: , , , ,

13 comments:

  1. I really appreciate information shared above. It’s of great help. If someone want to learn Online (Virtual) instructor lead live training in Couch DB, kindly contact us http://www.maxmunus.com/contact
    MaxMunus Offer World Class Virtual Instructor led training on Couch DB. We have industry expert trainer. We provide Training Material and Software Support. MaxMunus has successfully conducted 100000+ trainings in India, USA, UK, Australlia, Switzerland, Qatar, Saudi Arabia, Bangladesh, Bahrain and UAE etc.
    For Demo Contact us.
    Nitesh Kumar
    MaxMunus
    E-mail: nitesh@maxmunus.com
    Skype id: nitesh_maxmunus
    Ph:(+91) 8553912023
    http://www.maxmunus.com/




    ReplyDelete
  2. This makes sense. Thanks for all the explanation that you have provided very briefly in this blog.

    Learn Advanced Excel in Bangalore

    ReplyDelete
  3. This is my first time go to see at here and i am actually happy to read everthing at one place. facebook log in

    ReplyDelete
  4. Really great blog, it's very helpful and has great knowledgeable information.

    IOT services | Inernet of Things Services | Austere Technologies

    ReplyDelete
  5. Wow...What an excellent informative blog, really helpful. Thank you.

    Best Degree Colleges Hyderabad | Avinash College of Commerce

    ReplyDelete
  6. This comment has been removed by the author.

    ReplyDelete
  7. Excellent information
    "Sanjary Academy provides excellent training for Piping design course. Best Piping Design Training Institute in Hyderabad,
    Telangana. We have offer professional Engineering Course like Piping Design Course,QA / QC Course,document Controller
    course,pressure Vessel Design Course, Welding Inspector Course, Quality Management Course, #Safety officer course."
    Piping Design Course in India­
    Piping Design Course in Hyderabad
    QA / QC Course
    QA / QC Course in india
    QA / QC Course in Hyderabad
    Document Controller course
    Pressure Vessel Design Course
    Welding Inspector Course
    Quality Management Course
    Quality Management Course in india
    Safety officer course

    ReplyDelete
  8. It has been simply incredibly generous with you to provide openly
    what exactly many individuals would’ve marketed for an eBook to end
    up making some cash for their end, primarily given that you could
    have tried it in the event you wanted.
    oracle dba training in chennai
    java training in chennai
    node js training in chennai

    ReplyDelete
  9. Your good knowledge and kindness in playing with all the pieces were
    very useful. I don’t know what I would have done if I had not
    encountered such a step like this.
    mysql online course in Chennai
    unix certification in Chennai

    ReplyDelete

Find me on Facebook! Follow me on Twitter!