Couchbase 批量加载错误与 upsert() (.NET SDK 2.0)
Couchbase Bulk loading error with upsert() (.NET SDK 2.0)
我在使用 upsert 函数插入批量数据时遇到错误,但不知道如何修复它。有人知道这里出了什么问题吗?该程序本质上是从 SQL 服务器数据库中获取数据并加载到我们在 Amazon 实例上的 Couchbase 存储桶中。它最初确实开始加载,但在大约 10 次左右更新后它崩溃了。
我的错误如下:
集合被修改;枚举操作可能无法执行。
以下是错误的屏幕截图(抱歉,该错误仅在我的其他 Amazon 服务器实例上复制,而不是在本地复制):
http://imgur.com/a/ZJB0c
这是调用 upsert 方法的函数。这被调用了多次,因为我一次只检索部分数据,因为 SQL table 非常大。
private void receiptItemInsert(double i, int k) {
const int BATCH_SIZE = 10000;
APSSEntities entity = new APSSEntities();
var data = entity.ReceiptItems.OrderBy(x => x.ID).Skip((int)i * BATCH_SIZE).Take(BATCH_SIZE);
var joinedData = from d in data
join s in entity.Stocks
on new { stkId = (Guid)d.StockID } equals new { stkId = s.ID } into ps
from s in ps.DefaultIfEmpty()
select new { d, s };
var stuff = joinedData.ToList();
var dict = new Dictionary<string, dynamic>();
foreach (var ri in stuff)
{
Stock stock = new Stock();
var ritem = new CouchModel.ReceiptItem(ri.d, k, ri.s);
string key = "receipt_item:" + k.ToString() + ":" + ri.d.ID.ToString();
dict.Add(key, ritem);
}
entity.Dispose();
using (var cluster = new Cluster(config))
{
//open buckets here
using (var bucket = cluster.OpenBucket("myhoney"))
{
bucket.Upsert(dict); #CRASHES HERE
}
}
}
如 Couchbase Forums 中所述,这可能是 SDK 中的错误。
初始化couchbase集群的内部映射时,SDK会构建一个List
个端点。如果两个以上的线程(如批量更新插入期间的情况)同时触发此代码,一个人可能会看到 List
的一个实例被另一个填充(因为锁定是在调用 List.Any()
, 修改列表可能会崩溃).
我在使用 upsert 函数插入批量数据时遇到错误,但不知道如何修复它。有人知道这里出了什么问题吗?该程序本质上是从 SQL 服务器数据库中获取数据并加载到我们在 Amazon 实例上的 Couchbase 存储桶中。它最初确实开始加载,但在大约 10 次左右更新后它崩溃了。
我的错误如下: 集合被修改;枚举操作可能无法执行。 以下是错误的屏幕截图(抱歉,该错误仅在我的其他 Amazon 服务器实例上复制,而不是在本地复制): http://imgur.com/a/ZJB0c
这是调用 upsert 方法的函数。这被调用了多次,因为我一次只检索部分数据,因为 SQL table 非常大。
private void receiptItemInsert(double i, int k) {
const int BATCH_SIZE = 10000;
APSSEntities entity = new APSSEntities();
var data = entity.ReceiptItems.OrderBy(x => x.ID).Skip((int)i * BATCH_SIZE).Take(BATCH_SIZE);
var joinedData = from d in data
join s in entity.Stocks
on new { stkId = (Guid)d.StockID } equals new { stkId = s.ID } into ps
from s in ps.DefaultIfEmpty()
select new { d, s };
var stuff = joinedData.ToList();
var dict = new Dictionary<string, dynamic>();
foreach (var ri in stuff)
{
Stock stock = new Stock();
var ritem = new CouchModel.ReceiptItem(ri.d, k, ri.s);
string key = "receipt_item:" + k.ToString() + ":" + ri.d.ID.ToString();
dict.Add(key, ritem);
}
entity.Dispose();
using (var cluster = new Cluster(config))
{
//open buckets here
using (var bucket = cluster.OpenBucket("myhoney"))
{
bucket.Upsert(dict); #CRASHES HERE
}
}
}
如 Couchbase Forums 中所述,这可能是 SDK 中的错误。
初始化couchbase集群的内部映射时,SDK会构建一个List
个端点。如果两个以上的线程(如批量更新插入期间的情况)同时触发此代码,一个人可能会看到 List
的一个实例被另一个填充(因为锁定是在调用 List.Any()
, 修改列表可能会崩溃).