文档章节

couchDB入门demo

nice_so
 nice_so
发布于 2013/11/07 10:27
字数 764
阅读 145
收藏 0
点赞 0
评论 0
  1. couchDB下载地址

  2. 在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");
     }
}

 

© 著作权归作者所有

共有 人打赏支持
nice_so
粉丝 7
博文 10
码字总数 5904
作品 0
成都
程序员
hyperledger v1.0.5 区块链运维入门

摘要 你网上搜索hyperledger大部分文章是讲解开发环境的安装与配置,没有一篇关于怎样运维区块链的文章。当你配置好开发环境,写好合约,怎样落地呢?却很少文章提及。 要将区块链落地,我们...

雪花又一年 ⋅ 04/18 ⋅ 0

PouchDB:可随时同步的开源JavaScript数据库

PouchDB是一个开源的JavaScript数据库,可以运行在浏览器中。PouchDB的数据存储、处理方式受到了Apache CouchDB的启发(CouchDB是一个面向文档的数据库,可通过JavaScript以MapReduce的方式对...

thinkyoung ⋅ 2014/12/13 ⋅ 0

精通Hyperledger之Hyperledger composer查询语言(17)

1、概念理解 Hyperledger Composer中的查询以定制查询语言编写。查询在业务网络定义中的一个称为()的查询文件中定义。 所有查询都必须包含和属性。 该属性是描述查询功能的字符串。它必须包...

木九天 ⋅ 06/13 ⋅ 0

一名合格的数据分析需要具备什么样的技能?

如今是一个数据说话的时代,同时也是一个数据竞争的时代,一切都是靠数据说话,而也正是因为这样方方面面的原因,让数据分析师这个职业水涨船高,市场需求很大。那么,我们需要先了解一下什么...

加米谷大数据 ⋅ 04/24 ⋅ 0

从Prism中学习设计模式之Event Aggregator 模式

Event Aggregator 模式定义:渠道事件从多个对象通过一个单一的对象来简化clients的注册。 结构图: Prism的Event Aggregator 模式:Event Aggregator允许多对象定位和发布、订阅事件。 我们...

andrewniu ⋅ 05/29 ⋅ 0

首发预警 | 黑客利用Hadoop Yarn资源管理系统未授权访问漏洞进行攻击

4月30日,阿里云发现,俄罗斯黑客利用Hadoop Yarn资源管理系统REST API未授权访问漏洞进行攻击。 Hadoop是一款由Apache基金会推出的分布式系统框架,它通过著名的 MapReduce 算法进行分布式处...

云安全2016 ⋅ 05/07 ⋅ 0

预警:黑客利用Hadoop Yarn未授权访问漏洞

  【IT168 评论】4月30日,阿里云发现,俄罗斯黑客利用Hadoop Yarn资源管理系统REST API未授权访问漏洞进行攻击。   Hadoop是一款由Apache基金会推出的分布式系统框架,它通过著名的 Ma...

云栖社区 ⋅ 05/07 ⋅ 0

Ceph v13.0.1 发布,分布式文件系统

Ceph v13.0.1 发布了。Ceph 是一个可扩展的分布式存储系统,性能卓越,安全可靠。 该版本暂未功更新内容。相关内容请参阅提交记录,或关注发布主页。 下载地址: Source code (zip) Source c...

达尔文 ⋅ 02/02 ⋅ 0

git相关操作

linux、git bash如何生成ssh key 1.Centos安装及配置 $ yum install -y git 2.生成ssh-key # 生成ssh key,公钥添加到gitlab,用于账号认证。生成过一次就不需要再次生成了。$ ssh-keygen 运...

botkenni ⋅ 03/01 ⋅ 0

Sylius v1.1.0-RC 发布,添加 symfony 插件

Sylius v1.1.0-RC 发布。Sylius 是一个开源的 PHP 电子商务网站框架,基于 Symfony 和 Doctrine 构建,为用户量身定制解决方案。可管理任意复杂的产品和分类,每个产品可以设置不同的税率,支...

周其 ⋅ 02/03 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JAVA RMI

什么是JAVA RMI Java RMI (Remote Method Invocation) 远程方法调用,能够让客户端像使用本地调用一样调用服务端 Java 虚拟机中的对象方法。RMI 是面向对象语言领域对 RPC (Remote Proced...

saulc ⋅ 19分钟前 ⋅ 0

Linux系统工程狮养成记

如今的社会,随着时代的发展,出现了很多职业,像电子类,计算机类的专业,出现了各种各样的工程师,有算法工程师,java工程师,前端工程师,后台工程师,Linux工程师,运维工程师等等,不同...

linux-tao ⋅ 29分钟前 ⋅ 0

进入编辑模式 vim命令模式 vim实践

1.

oschina130111 ⋅ 29分钟前 ⋅ 0

mysql用户管理、常用sql语句、mysql数据库备份恢复

1. mysql用户管理 mysql默认有一个root超级管理员账户,实际工作环境中不可能每个人都用此root权限,防止误操作、误删除,可以给单独的用户进行授权。 Mysql创建用户以及授权: grant all on...

laoba ⋅ 30分钟前 ⋅ 0

类型后面三个点(String...)和数组(String[])的区别

类型后面三个点(String…),是从Java 5开始,Java语言对方法参数支持一种新写法,叫可变长度参数列表,其语法就是类型后跟…,表示此处接受的参数为0到多个Object类型的对象,或者是一个Obj...

流氓兔- ⋅ 36分钟前 ⋅ 0

JEPLUS表格组件之表格合并——JEPLUS软件快速开发平台

JEPLUS表格组件之表格合并 我们在列表配置时会遇见这样的一种情况,需要对个人的数据进行统一化,对一些数据进行归类,这样展示出来美观又直观,在这篇笔记中我来给大家介绍下如何配置出来专...

JEPLUS ⋅ 37分钟前 ⋅ 0

golang 并发中全局唯一操作

package main// go 携程共享 数据// 加锁解锁操作// 同步锁import ("sync""fmt")// 创建Once结构var once = sync.Once{}func computed(data *int, lock *sync.Mut...

304158 ⋅ 38分钟前 ⋅ 0

Mobx入门之二:asynchronous actions

这一节主要看mobx怎么实现asynchronous actions 1 要实现的demo功能 输入地名,查询天气,利用openweathermap api 2 思想 observable观察数据:location地点、temperature温度 observer响应式...

pengqinmm ⋅ 40分钟前 ⋅ 0

【2018.0620学习笔记】【linux高级知识 13.4-13.6】

13.4 mysql用户管理 创建用户并授权: grant all on *.* to '用户名'@'ip' identified by '密码' //all是操作权限,*.*是库.表,指定格式是'用户名'@'localhost'才能用socket登录本地 gra...

lgsxp ⋅ 今天 ⋅ 0

Java强弱引用示例

package jdk;import java.lang.ref.PhantomReference;import java.lang.ref.ReferenceQueue;import java.lang.ref.SoftReference;import java.lang.ref.WeakReference;public ......

月下狼 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部