上文中我们已经建立了项目的基本结构,今天实现数据的修改。在NoSQL中,通常添加和修改都认为是对数据的一种Mutation。
 

1.建立描述修改Row的实体。

    public class RowMutation
{
public string Key { get; set; } public IList<CellMutation> Mutations { get; set; } public RowMutation()
{ } public RowMutation(string key)
{
Key = key;
} public RowMutation(string key, IList<CellMutation> mutations)
{
Key = key;
Mutations = mutations;
}
} public class CellMutation
{
public string ColumnName { get; set; } public string DataValue { get; set; } public CellMutation()
{ } public CellMutation(string name)
{
ColumnName = name;
} public CellMutation(string name, string value)
{
ColumnName = name;
DataValue = value;
}
}

2.引用aquiles命名空间。

using Aquiles.Helpers.Encoders;
using Aquiles.Cassandra10;
using Aquiles.Core.Cluster;

3.初始化成员变量

        private string _clusterName { get; set; }
private ConsistencyLevel _consistencyLevel { get; set; }
private string _keyspaceName { get; set; }
private ICluster _cluster = null; public AquilesDemo()
{
_clusterName = "xxxx";
_consistencyLevel = ConsistencyLevel.LOCAL_QUORUM;
_keyspaceName = "xxxx"; _cluster = AquilesHelper.RetrieveCluster(_clusterName);
}

4.建立一个通用的修改多行多列的方法,其它改变方式可以在此基础上完成调用,如修改一多一列,一行多列等。

       public void Mutate(string columnFamily, IList<RowMutation> rowMutations)
{
if (string.IsNullOrWhiteSpace(columnFamily)) throw new ArgumentNullException("columnFamily"); rowMutations = PrepareMutationList(rowMutations);
Dictionary<byte[], Dictionary<string, List<Apache.Cassandra.Mutation>>> mutation_map = new Dictionary<byte[], Dictionary<string, List<Apache.Cassandra.Mutation>>>(); foreach (var rowMutation in rowMutations)
{
byte[] key = ByteEncoderHelper.UTF8Encoder.ToByteArray(rowMutation.Key); Dictionary<string, List<Apache.Cassandra.Mutation>> cfMutation = new Dictionary<string, List<Apache.Cassandra.Mutation>>();
List<Apache.Cassandra.Mutation> mutationList = new List<Apache.Cassandra.Mutation>(); foreach (CellMutation cellMutation in rowMutation.Mutations)
{
if (cellMutation.DataValue == null) continue; Apache.Cassandra.Mutation mutation = new Apache.Cassandra.Mutation()
{
Column_or_supercolumn = new ColumnOrSuperColumn()
{
Column = new Column()
{
Name = ByteEncoderHelper.UTF8Encoder.ToByteArray(cellMutation.ColumnName),
Timestamp = DateTime.Now.ToUnixTimestamp(),
Value = ByteEncoderHelper.UTF8Encoder.ToByteArray(cellMutation.DataValue),
},
},
};
mutationList.Add(mutation);
} if (mutationList.Count > )
{
cfMutation.Add(columnFamily, mutationList);
mutation_map.Add(key, cfMutation);
}
} if (mutation_map.Count == ) return;
_cluster.Execute(new ExecutionBlock(delegate(Apache.Cassandra.Cassandra.Client client)
{
client.batch_mutate(mutation_map, _consistencyLevel);
return null;
}), _keyspaceName); }

5. 由于调用端可能会将同一行的修改分为多个RowMutation传入,所以上面的代码使用PrepareMutationList方法根据RowKey作了聚合处理。

        /// <summary>
/// 聚合列表中相同rowkey的项为同一Mutation。
/// </summary>
/// <param name="rowMutations"></param>
/// <returns></returns>
private IList<RowMutation> PrepareMutationList(IList<RowMutation> rowMutations)
{
if (rowMutations == null) return null; //按rowkey分组
var rowMutationGroups = rowMutations.GroupBy(rm => rm.Key); //分组后的总数量相同,则认为rowkey在列表中是唯一的,不用做聚合处理
if (rowMutations.Count == rowMutationGroups.Count()) return rowMutations; //遍历分组结果
IList<RowMutation> result = new List<RowMutation>();
foreach (var rmg in rowMutationGroups)
{
RowMutation rowMutation = new RowMutation();
rowMutation.Key = rmg.Key; //将同一分组的所有CellMutation放在一个列表中
List<CellMutation> cellMutations = new List<CellMutation>();
foreach (var rm in rmg)
{
cellMutations.AddRange(rm.Mutations);
} if (cellMutations.Count() > )
{
rowMutation.Mutations = cellMutations;
result.Add(rowMutation);
}
}
return result;
}

在.net中使用aquiles访问Cassandra(二)的更多相关文章

  1. 在.net中使用aquiles访问Cassandra(一)

    aquiles是.net下基于Thrift协议访问Cassandra的第三方类库,官方地址是: http://aquiles.codeplex.com/   1.下载类库文件: http://aqui ...

  2. 在.net中使用aquiles访问Cassandra(四)

    数据的持久化我们都已经完成了,和所有应有程序一样,最重要的是要向用户展示数据.下面我们就推出这部分代码,读取任意行任何列: public IList<TRowResult> Execute ...

  3. 在.net中使用aquiles访问Cassandra(三)

    之前我们实现了如何修改数据,还需要相应的删除动作.删除方式会有几种情况,以下分别一一介绍.   1.批量删除,适应于多行多列的情况. public void Remove(string columnF ...

  4. ArcGIS Engine中的数据访问

    ArcGIS Engine中的数据访问 数据是GIS的基础, 访问数据也是进行任何复杂的空间分析及空间可视化表达的前提.ArcGIS支持的数据格式比较丰富,对不同的数据格式支持的程度也有很大差异.本文 ...

  5. 已禁用对分布式事务管理器(MSDTC)的网络访问。请使用组件服务管理工具启用 DTC 以便在 MSDTC 安全配置中进行网络访问。

    今天写ASP.NET程序,在网页后台的c#代码里写了个事务,事务内部对一张表进行批量插入,对另外一张表进行查询与批量插入. 结果第二张表查询后foreach迭代操作时报错:已禁用对分布式事务管理器(M ...

  6. 自建目录中jsp页面访问servlet路径出错404

    ---恢复内容开始--- 自建目录中jsp页面访问servlet路径出错404 使用eclipse建立的项目,总是会遇到路径问题,比如jsp页面访问servlet,jsp在默认的路径.jsp在自建目录 ...

  7. 在KVM虚拟机中使用spice系列之二(USB映射,SSL,密码,多客户端支持)

    在KVM虚拟机中使用spice系列之二(USB映射,SSL,密码,多客户端支持) 发布时间: 2015-02-27 00:16 1.spice的USB重定向 1.1 介绍 使用usb重定向,在clie ...

  8. 【java】基础中的杂乱总结(二)

    1 内部类进阶 package package8; //原则:先用内部类写 之后由于内部类匿名无法引用 用其继承的父类或实现的接口名 //再复写所有的抽象方法即可(是所有,否者还是抽象的,无法创建对象 ...

  9. Java基础进阶:多态与接口重点摘要,类和接口,接口特点,接口详解,多态详解,多态中的成员访问特点,多态的好处和弊端,多态的转型,多态存在的问题,附重难点,代码实现源码,课堂笔记,课后扩展及答案

    多态与接口重点摘要 接口特点: 接口用interface修饰 interface 接口名{} 类实现接口用implements表示 class 类名 implements接口名{} 接口不能实例化,可 ...

随机推荐

  1. 默认构造方法并非总是public的

    以前印象中一直有一个概念,说"如果没有提供构造方法,java将自动添加一个空的public的构造方法".现在看来,有2个问题,一,默认构造方法未必是public的,二,默认构造方法 ...

  2. easyui tree onloadsuccess事件的心得

    在onloadSuccess事件中不能apeed新节点,否则又会触发noloadsuccess事件,形成死循环. 公司电话:028-87657875           13060063607 淘宝店 ...

  3. SVN服务器的配置(简单易懂,带配置文件,有注释)

    这两天在服务器搭建了一个SVN服务器,一些经验,也留作后用把,有不详细的欢迎批评指正 另外关于子目录的访问配置,这块我还是不懂,希望有前辈能教我一下 1.安装SVN Serveryum install ...

  4. dhtmlx相关

    主页:http://dhtmlx.com/ 文档地址:http://docs.dhtmlx.com/ 后台:https://dhtmlx.com/docs/products/dhtmlxConnect ...

  5. c#数据库访问读取数据速度测试

    1,使用byte数据读取 2,使用dataset数据读取

  6. IB交换机配置命令总结

    串口通过远程CRT登录,波特率9600用户名和密码都是adminDo you want to use the wizard for initial configuration?选择no打开ip rou ...

  7. 【开发环境】JAVA 环境变量批处理

    @echo off set regpath=HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environmen ...

  8. win32 COM组件编写

    win32的com组件: 1. 编辑idl,idl文件会生成对应的com class和com interface,例如 [ object, uuid(xxxxxxxx-xxxx-xxxx-xxxx-x ...

  9. 分析Linux内核创建一个新进程的过程

    一.原理分析 1.进程的描述 进程控制块PCB——task_struct,为了管理进程,内核必须对每个进程进行清晰的描述,进程描述符提供了内核所需了解的进程信息. struct task_struct ...

  10. libev安装与示例程序编译运行

    Linux平台C网络编程,之前总是看各大名著(如UNIX环境高级编程和UNIX网络编程,还有TCP/IP详解 卷1:协议和深入理解计算机系统(原书第2版)),同时写点小程序练习.然而还是拿不出手. 参 ...