NoSQL专题
CouchDB的安装使用教程
Apache CouchDB通常简称为CouchDB的,是一个开放源码的数据库,侧重于易用性和完全拥抱网络"数据库"。 这是一个NoSQL数据库,使用JSON来存储数据,使用JavaScript作为它的查询语言,内部使用MapReduce和HTTP API。 其显着特点之一是多主复制。CouchDB数据库没有schema,或刚性预定义的数据结构如数据表。在CouchDB存储的数据是一个JSON文档。可以动态变化,以适应不断变化的需求。 CouchDB中还提供了一个内置的管理界面,通过Web访问称为Futon。
特点:
- 文件存储:
CouchDB将数据存储为文件,一个或多个字段/值对的JSON,字段值可以是简单如字符串,数字或日期,但有序列表和关联数组也可以使用。一个CouchDB数据库中每一个文件都有唯一ID ,没有必要的Schema。
- ACID语义:
CouchDB提供ACID语义。它通过实施某种形式的多版本并行控制,这意味着CouchDB可以处理大量并发读者和作家没有冲突。
- Map / Reduce的视图和索引:
存储的数据使用视图作为结构。在CouchDB中,每个视图是一个JavaScript函数作为Map构建,这个Map是Map/reduce的Map。函数取得一个文件,并把它转换成一个单一的值并返回。 CouchDB可以索引视图,并保持更新这些索引,当文件添加,删除或更新时。
- 使用复制的分布式架构:
CouchDB的设计采用双向复制(或同步)和脱机操作。这意味着相同数据数据有多个副本,对其进行修改时,在以后的时间这些修改会同步。
- REST API :
所有项目都有一个唯一的URI会通过HTTP暴露。 REST使用HTTP方法POST , GET , PUT和DELETE的四个基本的CRUD (创建,读取,更新,删除)操作上的所有资源。
- 最终一致性:
CouchDB的保证最终一致性,能够提供可用性和分区容忍性。
- 内置离线:
CouchDB可以复制到设备(如智能手机)脱机处理数据同步时,该设备为您重新联机。
- 免费模式:
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;
}
}