我想要批量插入40000行到Cassandra。但它始终停在数字32769并给我一个例外" System.ArgumentOutOfRangeException"。我应该怎么做才能向Cassandra插入超过32769行。
这是我的代码:
//建立DCS 資料
DateTime ToDay = DateTime.Today;
string LotStr = ToDay.ToString("yyMMdd");
DateTime NowTime = DateTime.Now;
List<DCS_Model> DCS_list = new List<DCS_Model>();
Random rnd = new Random();
for (int i = 1; i <= 40000; i++)
{
DCS_list.Add(new DCS_Model(LotStr, String.Format("Tag_{0}", i), rnd.Next(1000) + rnd.NextDouble(), NowTime, NowTime));
}
//上傳至Cassandra
DateTime tt = DateTime.Now;
Cluster cluster = Cluster.Builder().AddContactPoint("192.168.52.182").Build();
ISession session = cluster.Connect("testkeyspace");
//List<PreparedStatement> StatementLs = new List<PreparedStatement>();
var InsertDCS = session.Prepare("INSERT INTO DCS_Test (LOT, NAME, VALUE, CREATETIME, SERVERTIME) VALUES (?, ?, ?, ?, ?)");
var batch = new BatchStatement();
foreach (DCS_Model dcs in DCS_list)
{
batch.Add(InsertDCS.Bind(dcs.LOT,dcs.NAME,dcs.VALUE,dcs.CREATETIME,dcs.SERVERTIME));
}
session.Execute(batch);
//Row result = session.Execute("select * from TestTable").First();
TimeSpan CassandraTime = DateTime.Now - tt;
//Console.WriteLine(CassandraTime);
它会停在batch.Add(InsertDCS.Bind(dcs.LOT,dcs.NAME,dcs.VALUE,dcs.CREATETIME,dcs.SERVERTIME))
批量添加32768次。
请帮帮我。谢谢!
答案 0 :(得分:1)
RDBMS世界中的批处理功能甚至无法使用Cassandra远程镜像批处理功能。它们的名称可能相同,但它们的设计目的不同。事实上,Cassandra应该被重命名为“原子”以避免混淆。
不要一次性地将它们一起批量处理,而是尝试发送40k个别请求,与可听的未来同步(以便您知道它们何时完成)。我相信Java ListenableFuture
的C#等价物是SettableFuture
。你应该研究一下。
发送40k个别交易可能看起来违反直觉。但它肯定会击败一个Cassandra节点作为协调器(连同节点将生成的所有网络流量)来处理并确保40k upsert的原子性。
此外,请确保使用令牌识别负载平衡策略。这会将你的upsert引导到它需要的确切节点(使用协调器节省你的网络跳跃)。
Cluster cluster = Cluster.Builder().AddContactPoint("192.168.52.182").Build()
.WithLoadBalancingPolicy(new TokenAwarePolicy
(new DCAwareRoundRobinPolicy("westDC")));
答案 1 :(得分:0)
我发现函数的源代码&#34; BatchStatement&#34;当add count超过Int16.MaxValue时会抛出异常。所以我改变了源代码然后解决了这个问题!!