2012-04-27 6 views
6

lightcouch APIを使用してJavaからcouchdbに接続しています。 dbclient.save(object)メソッドを使用して単一の文書を保存することができます。しかし、私の要件は一度に大量の文書を保存することです。 Lightcouch APIを使用して大量の文書を保存する方法はありません。解決策を提案してください。Javaでlightcouch APIを使用してcouchdbに大量の文書を保存する方法

ありがとうございます!

+0

LightCouch APIではバルクの保存はサポートされていませんが、次のリリースで予定されています。 – ahmedyha

+0

これがショーストッパーの場合は、Apache HttpclientとJacksonのようなものを使って、ソファを書くためにソファ – skipy

答えて

3

私はそれを外出することにしました。私は人を描写する文書を持ったデータベースを持っています。

public class Person extends Document { 

    private String firstname = ""; 
    private String lastname = ""; 
    private int age = -1; 

    public Person(String firstname, String lastname, int age) { 
     super(); 
     this.setFirstname(firstname); 
     this.setLastname(lastname); 
     this.setAge(age); 
    } 

    // setters and getters omitted for brevity 

} 

アルゴリズムは単純です:

はここDocumentLightCouchを拡張し、私のPersonクラスです。

  1. HTTPのPOSTリクエスト
  2. を作成し、配列
  3. にあなたの書類を入れタイプDocument
  4. の配列を作成しますJSONはリクエストボディ
  5. に配列を変換置き、それを
を送ります

コードはおおよそ次のようになります。

注:簡潔にするためにtry/catchを省略しました!もちろん、それらを使用することが期待されます。

public static void main(String[] args) { 

    // You could also use a List and then convert it to an array 
    Document[] docs = new Document[2]; 
    docs[0] = new Person("John", "Smith", 34); 
    docs[1] = new Person("Jane", "Smith", 30); 

    DefaultHttpClient httpClient = new DefaultHttpClient(); 

    // Note the _bulk_docs 
    HttpPost post = new HttpPost("http://127.0.0.1:5984/persons/_bulk_docs"); 

    Gson gson = new Gson(); 
    StringEntity data = 
     new StringEntity("{ \"docs\": " + gson.toJson(docs) + "}"); 
    data.setContentType("application/json"); 
    post.setEntity(data); 

    HttpResponse response = httpClient.execute(post); 

    if (response.getStatusLine().getStatusCode() != 201) { 
     throw new RuntimeException("Failed. HTTP error code: " 
      + response.getStatusLine().getStatusCode()); 
    } 
    BufferedReader br = new BufferedReader(
     new InputStreamReader((response.getEntity().getContent()))); 
    String output; 
    while ((output = br.readLine()) != null) { 
     System.out.println(output); 
    } 
    httpClient.getConnectionManager().shutdown(); 
} 

私は、この例では2つの注目すべき部分を説明します。

最初はドキュメントのコレクションです。この例では、例としてListの代わりに配列を使用しました。

Document[] docs = new Document[2]; 
docs[0] = new Person("John", "Smith", 34); 
docs[1] = new Person("Jane", "Smith", 30); 

あなたは、Javaのユーティリティメソッドを使用して配列に変換だけでなく、後でListを使用することができます。

第2のものはStringEntityです。 HTTP Bulk Document APIのCouchDBのドキュメントで、1つのリクエストで複数のドキュメントを変更する場合、リクエスト本体のJSON構造は次のようになります。

{ 
    "docs": [ 
    DOCUMENT, 
    DOCUMENT, 
    DOCUMENT 
    ] 
} 

これは幾分醜い定義の理由です。あなたがフィールド*の_id *とトランザクション・ステータス・インジケータと一緒に挿入された文書の* _rev *を表すオブジェクトを含むJSON配列を取得します応答として

StringEntity data = new StringEntity("{ \"docs\": " + gson.toJson(docs) + "}"); 

+1

+1に大量に電話をかけることができます。 –

0

私は同じことをしましたが、春のレストテンプレートを使用しました 次のようにドキュメントを保持するクラスを作成しました。

public class BulkUpdateDocument { 

    private List<Object> docs; 
    }  

私のレストコードは次のようになります。

BulkUpdateDocument doc = new BulkUpdateDocument(ListOfObjects); 

    Gson gson = new Gson(); 
    RestTemplate restTemplate = new RestTemplate(); 

    HttpHeaders header = new HttpHeaders(); 
    header.setContentType(MediaType.APPLICATION_JSON_UTF8); 
    HttpEntity<?> requestObject = new HttpEntity<Object>(gson.toJson(doc), header); 

    ResponseEntity<Object> postForEntity = restTemplate.postForEntity(path + "/_bulk_docs", requestObject, Object.class);