在安装好couchDB之后,具体安装细节可以参考上一篇
在google code 上面下载最新版本的jdbc驱动,jcouchDB及其所依赖的一些jar包。
commons-beanutils.jar
commons-codec-1.3.jar
commons-httpclient-3.1.jar
commons-io-1.3.1.jar
commons-logging-1.1.jar
easymock-2.3.jar
hamcrest-all-1.1.jar
junit-4.4.jar
log4j-1.2.14.jar
svenson-1.2.8.jar
引入这些jar包到项目里面去,然后开始动手写增删改查。。。
过程出了一些问题,因为过程无法重现,只能把evernote里面写的东西贴上了。
- 在attachment中需要添加一个digest属性,所以自己重新下了源码打成了jar包
- 在attachment中的getData方法是无实际意义的,使用了也获取不到数据。
路径如果为:
file:/F:/erp workspace/erp/WebRoot/WEB-INF/cfg/content-type.properties获取不到配置文件,
// Properties properties = Resources.getResourceAsProperties(getConfigFilePath());
改用
Properties properties = Resources.getUrlAsProperties( getConfigFilePath());
解决
DesinDocument在createDocument的时候出错,error code 401,没有足够的权限。
改为使用 BaseDocument,正常
附上自己测试类代码,仅供借鉴,无法保证程序的性能:
package com.erp.util; import java.io.BufferedOutputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Properties; import org.apache.ibatis.io.Resources; import org.apache.log4j.Logger; import org.jcouchdb.db.Database; import org.jcouchdb.document.BaseDocument; import org.jcouchdb.document.Document; import org.jcouchdb.document.ValueRow; import org.jcouchdb.document.ViewResult; /** * @author Liu Jia * @version 1.0.0 */ public class CouchTest { protected static Logger log = Logger.getLogger(CouchTest.class); private final static String CONTENT_TYPE_CONFIG_PATH = "cfg/content-type.properties"; private static Database db = new Database("localhost", "couchdb_test"); private static String path ="D:/software/jdk-7-windows-i586.zip"; /** * 功能: 通过文件对象获取字节数组 * * @param file 文件对象 * @return 字节数组 */ public static byte[] getBytesFromFile(File file) { if (file == null) { return null; } try { FileInputStream stream = new FileInputStream(file); ByteArrayOutputStream out = new ByteArrayOutputStream((int) file.length()); byte[] byteArray = new byte[(int) file.length()]; for (int n; (n = stream.read(byteArray)) != -1;) { out.write(byteArray, 0, n); } stream.close(); out.close(); return out.toByteArray(); } catch (IOException e) { } return null; } /** * 功能: 把字节数组生成文件 * * @param byteArray 字节数组 * @param outputFile 输出文件名称,包括后缀名 * @return 文件对象 */ public static File getFileFromBytes(byte[] byteArray, String outputFile) { BufferedOutputStream stream = null; File file = null; try { file = new File(outputFile); FileOutputStream fstream = new FileOutputStream(file); stream = new BufferedOutputStream(fstream); stream.write(byteArray); } catch (Exception e) { e.printStackTrace(); } finally { if (stream != null) { try { stream.close(); } catch (IOException e1) { e1.printStackTrace(); } } } return file; } /** * 功能: 根据docId获取文档 * * @param docId * 文档ID * @return 文档 */ public static Document getDocument(String docId) { BaseDocument doc = db.getDocument(BaseDocument.class, docId); return doc; } /** * 功能: 获取所有的值行,值行可以用于提取文档的ID * * @return 值行列表 */ @SuppressWarnings("rawtypes") public static List<ValueRow<Map>> getAllValueRow() { ViewResult<Map> resultList = db.listDocuments(null, null); return resultList.getRows(); } /** * 功能: 创建附件 * */ @SuppressWarnings("rawtypes") public static void createAttachment() { List<ValueRow<Map>> resultList = getAllValueRow(); List<String> idList = new ArrayList<String>(); for (ValueRow<Map> row : resultList) { idList.add(row.getId()); } path = "D:/software/jdk-7-windows-i586.zip"; File file = new File(path); System.out.println("==================="+file.length()); byte[] data = getBytesFromFile(file); String contentType = getContentType(file.getName()); for (String docId : idList) { BaseDocument document = db.getDocument(BaseDocument.class, docId); db.createAttachment(docId, document.getRevision(), file.getName(), contentType, data); } } /** * 功能: 根据文档的后缀获取该文档的内容类型 * * @param suffix 后缀 * @return 内容类型 */ public static String getContentType(String name) { String suffix = name.substring(name.indexOf(".")); String contentType = ""; try { Properties properties = Resources.getUrlAsProperties(getConfigFilePath()); contentType = properties.getProperty(suffix, "text/plain"); } catch (IOException e) { e.printStackTrace(); } return contentType; } /** * 功能: 获取配置文件的 * * @return */ public static String getConfigFilePath() { String path = CouchTest.class.getClassLoader().getResource("").toString(); path = path.replace("classes/", ""); path += CONTENT_TYPE_CONFIG_PATH; try { path = URLDecoder.decode(path, "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } System.out.println(path); return path; } /** * * @param userId */ public static void createDocumentByUserId(String userId) { BaseDocument document = new BaseDocument(); document.setId(userId); document.setProperty("privilege", "111 010"); db.createDocument(document); } public static void main(String[] args) { createAttachment(); long start_time = System.currentTimeMillis(); byte[] data = db.getAttachment("f3b34e9592ef0650544554de45003859", path); getFileFromBytes(data, "erp123.zip"); long end_time = System.currentTimeMillis(); System.out.println(end_time-start_time); // log.warn("===============" + data); // createDocumentByUserId("1"); } }
相关推荐
通过以上介绍可以看出,《Beginning CouchDB》这本书不仅介绍了CouchDB的基本概念和技术细节,还深入探讨了其应用场景和最佳实践,对于希望学习和使用CouchDB的开发者来说是一本非常有价值的参考书。
通过这种方式,开发者可以在本地进行开发,然后直接将整个目录推送到CouchDB实例上,实现应用的部署。 在Python-CouchApp的开发过程中,开发者可以利用Python编写各种逻辑,包括但不限于: 1. **视图(Views)**:...
Apache CouchDB是一个开源的、基于文档的分布式数据库系统,它采用了JSON作为数据格式,并使用JavaScript进行查询和数据处理。在2.3.1版本中,CouchDB继续提供了一流的可扩展性和灵活性,适用于各种应用程序,特别是...
通过本书提供的内容,读者将具备开始使用CouchDB所需的所有知识,无论是初级还是中级水平的读者,都能从中受益。作者希望读者在学习过程中能感受到同样的乐趣,正如他写作时所体验的那样。 总的来说,《初识CouchDB...
#### 二、MapReduce在CouchDB中的应用 MapReduce是CouchDB中最核心的数据处理方式之一,它提供了一种灵活且高效的方式来对大量文档进行聚合分析和查询操作。 ##### 2.1 临时视图(Temporary Views) 临时视图允许...
三位CouchDB的开发者向你展示了如何以独立应用框架的形式来使用这一面向文档的数据库,以及如何使用它来构建高容量、分布式的应用。 CouchDB简洁的存储,处理,以及读取数据的模型,让它成为了构建处理海量松散结构...
CouchDB支持单向和双向复制,可以轻松地在多个CouchDB实例之间同步数据。这种复制机制不仅适用于数据中心内部,也适用于跨数据中心甚至跨国界的数据同步。 复制过程是增量式的,只传输自上次复制以来发生变化的数据...
学习couchDB 的入门教程
CouchDB的核心是基于JSON(JavaScript Object Notation)的数据存储方式,这种格式易于读写且兼容性好,使得CouchDB非常适合Web应用。每个存储的文档都是一个独立的JSON对象,可以包含任意数量的键值对。此外,...
这一特性使得CouchDB非常适合需要并发读写操作的应用场景。 CouchDB支持水平扩展性,这意味着可以通过复制(replication)机制来扩展数据库系统。利用CouchDB的双向复制和离线操作能力,可以轻松实现数据的分布式...
九、案例与应用场景 CouchDB适用于需要高可用性、可扩展性和离线功能的场景,如物联网设备数据存储、移动应用本地缓存、实时日志分析等。其强大的复制功能也常用于分布式系统的数据同步。 总的来说,CouchDB是一款...
CouchDB是一种基于文档的分布式数据库系统,采用JSON作为数据格式,JavaScript作为查询语言,并且支持多版本并发控制,使其在大数据和实时Web应用中表现出色。 1. **CouchDB核心概念** - **文档存储**:CouchDB以...
7. **案例分析**:通过具体的项目实例,展示了CouchDB在实际应用场景中的部署和优化策略。 #### 三、CouchDB核心概念 - **文档存储**:CouchDB采用了文档模型来存储数据,每个文档都包含一组键值对,支持JSON格式...
Fabric 1.4基于couchdb环境搭建步骤,以及基于couchdb的区块链多字段数据查询
CouchDB是一款开源的、基于文档的分布式数据库...通过Python的CouchDB模块,你可以充分利用CouchDB的灵活性和易用性,构建可扩展、容错的应用程序。结合CouchDB的特性,如复制和视图,可以实现高效的数据管理和检索。
sofa-CouchDB 是 CouchDB 的独立博客,使用 CouchDB 的书来做主要内容,这方便了所有用来在这博客上交流他们的想法,并且里面提供了很多帮助指导,这都是 HTML,Javascript 和 CouchDB 的结晶。目前支持任何人在上面...
本篇文章将深入探讨如何使用Node.js来实现一种容错方法,针对CouchDB集群的复制过程。CouchDB是一款开源、分布式文档数据库,它支持JSON文档格式,提供复制功能以确保数据的高可用性和冗余。 标题“Node.js-复制...