Отправка нескольких документов в CouchDB с помощью myCouch
Я перемещаю базу данных SQL в couchDB. У меня возникают проблемы при публикации нескольких документов, например, около 8 тыс. Документов. Код ниже:
MyClass cl = new MyClass();
foreach (DataRow row in dteqEvent.Rows)
{
NewSnDocument pn = new NewSnDocument();
pn.id = row[1].ToString(); //this is the document id
pn.val = row[2].ToString();
string json = JsonConvert.SerializeObject(pn);
cl.PostToCouch(json); //method under MyClass to post documents
}
Тогда под MyClass у меня есть метод ниже:
public async void PostToCouch(string json)
{
using (var client = new MyCouchClient(HostServer, Database))
{
var resp = await client.Documents.PostAsync(json);
Console.WriteLine(resp.StatusCode);
}
}
Первые 2K идентификаторы успешно размещены, после чего выдает ошибку. Ошибка говорит: "Невозможно подключиться к удаленному серверу". InnerException заявляет: "Невозможно установить соединение, потому что целевая машина активно отказала ему". Это как-то связано с моей конфигурацией couchDB.
Есть ли альтернативный способ размещения нескольких документов. Я видел массовую операцию в MyCouch, но она мне не понятна: https://github.com/danielwertheim/mycouch/wiki/documentation Заранее спасибо!
ОБНОВЛЕНИЕ: Хорошо, мне удалось решить мою проблему, немного подправив код:
MyClass cl = new MyClass();
List<NewSnDocument> pnList = new List<NewSnDocument>();
foreach (DataRow row in dteqEvent.Rows)
{
NewSnDocument pn = new NewSnDocument();
pn.id = row[1].ToString(); //this is the document id
pn.val = row[2].ToString();
pnList.Add(pn);
}
cl.PostToCouch(pnList);
Затем метод под MyClass:
public async void PostToCouch(List<NewSnDocument> obj)
{
int r = obj.Count;
using (var client = new MyCouchClient(HostServer, Database))
{
for(int i=0; i<r; i++)
{
string json = JsonConvert.SerializeObject(obj[i]);
var resp = await client.Documents.PostAsync(json);
Console.WriteLine(resp.StatusCode);
}
}
1 ответ
Я думаю, что даже ваш обновленный код не выглядит правильно. Я не уверен, пожалуйста, посмотрите на комментарии / изменения, которые я сделал в вашем коде:
MyClass cl = new MyClass();
List<NewSnDocument> pnList = new List<NewSnDocument>(); //List of documents
foreach (DataRow row in dteqEvent.Rows)
{
NewSnDocument pn = new NewSnDocument();
pn.id = row[1].ToString();
pn.val = row[2].ToString();
// cl.PostToCouch(pnList);
pnList.push(pn);//You need to push each document to the list of documents
//I'm not sure about C#, but there should some "push" method
//or something equivalent to "push"
}
cl.PostToCouch(pnList);//"pnList" contains a list of documents
//So it should be posted to CouchDB outside "foreach" loop
//After all documents have been pushed into it