lightcouch APIを使用してJavaからcouchdbに接続しています。 dbclient.save(object)メソッドを使用して単一の文書を保存することができます。しかし、私の要件は一度に大量の文書を保存することです。 Lightcouch APIを使用して大量の文書を保存する方法はありません。解決策を提案してください。Javaでlightcouch APIを使用してcouchdbに大量の文書を保存する方法
ありがとうございます!
lightcouch APIを使用してJavaからcouchdbに接続しています。 dbclient.save(object)メソッドを使用して単一の文書を保存することができます。しかし、私の要件は一度に大量の文書を保存することです。 Lightcouch APIを使用して大量の文書を保存する方法はありません。解決策を提案してください。Javaでlightcouch APIを使用してcouchdbに大量の文書を保存する方法
ありがとうございます!
私はそれを外出することにしました。私は人を描写する文書を持ったデータベースを持っています。
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
}
アルゴリズムは単純です:
はここDocument
LightCouchを拡張し、私のPerson
クラスです。
Document
コードはおおよそ次のようになります。
注:簡潔にするために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に大量に電話をかけることができます。 –
私は同じことをしましたが、春のレストテンプレートを使用しました 次のようにドキュメントを保持するクラスを作成しました。
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);
LightCouch APIではバルクの保存はサポートされていませんが、次のリリースで予定されています。 – ahmedyha
これがショーストッパーの場合は、Apache HttpclientとJacksonのようなものを使って、ソファを書くためにソファ – skipy