Thrift生成出的代码因为没有连接池,是无法用于生产环境的,所以我们必须利用带有连接池的第三方的.NET组件进行生产环境程序的开发,这里我推荐Aquiles,其它语言的高级客户端可参考这里:

http://wiki.apache.org/cassandra/ClientOptions

Aquiles的配置和代码,必须注意的是,代码和以前0.7.x的代码有很大差别,以前的代码是不能去访问Cassandra 1.0.0的
 

Web.config的配置

 
  
  1. <?xml version="1.0"?>   
  2.  
  3. <configuration>   
  4.  
  5.   <!-- 必须的配置,用于声明配置的节点 -->   
  6.  
  7.   <configSections>   
  8.  
  9.     <section name="aquilesConfiguration" type="Aquiles.Core.Configuration.AquilesConfigurationSection,Aquiles.Core"/>   
  10.  
  11.   </configSections>   
  12.  
  13.   <aquilesConfiguration>   
  14.  
  15.     <!-- 非必须,用于配置出错日志 -->   
  16.  
  17.     <loggingManager>Aquiles.Core.Diagnostics.Impl.TraceLogger,Aquiles.Core</loggingManager>   
  18.  
  19.     <clusters>   
  20.  
  21.       <!-- 必须,代码中调用的Cluster的名称必须与这个一致 -->   
  22.  
  23.       <add friendlyName="TestCluster1">   
  24.  
  25.         <connection poolType="SIZECONTROLLEDPOOL" factoryType="FRAMED">   
  26.  
  27.           <!--<connection poolType="NOPOOL" factoryType="FRAMED">-->   
  28.  
  29.           <specialConnectionParameters>   
  30.  
  31.             <add key="minimumClientsToKeepInPool" value="3"/>   
  32.  
  33.             <add key="maximumClientsToSupportInPool" value="1000"/>   
  34.  
  35.             <add key="magicNumber" value="7"/>   
  36.  
  37.             <add key="transportBufferSize" value="5000"/>   
  38.  
  39.           </specialConnectionParameters>   
  40.  
  41.         </connection>   
  42.  
  43.         <endpointManager type="ROUNDROBIN" defaultTimeout="6000">   
  44.  
  45.           <cassandraEndpoints>   
  46.  
  47.              <!-- 必须,Cassandra的IP地址和端口 -->   
  48.  
  49.             <add address="192.168.220.129" port="9160"/>   
  50.  
  51.           </cassandraEndpoints>   
  52.  
  53.         </endpointManager>   
  54.  
  55.       </add>   
  56.  
  57.     </clusters>   
  58.  
  59.   </aquilesConfiguration>   
  60.  
  61.   <system.diagnostics>   
  62.  
  63.     <trace autoflush="true" indentsize="2">   
  64.  
  65.       <listeners>   
  66.  
  67.         <remove name="Default"/>   
  68.  
  69.         <add name="myListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="d:\trace.log"/>   
  70.  
  71.       </listeners>   
  72.  
  73.     </trace>   
  74.  
  75.   </system.diagnostics>   
  76.  
  77. <startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>   

 

Aquiles的插入操作

 

 
  
  1. public long InsertData()   
  2.  
  3.   {   
  4.  
  5.       Aquiles.Helpers.Encoders.UTF8EncoderHelper utf8Encoder = new Aquiles.Helpers.Encoders.UTF8EncoderHelper();   
  6.  
  7.       ICluster cluster = AquilesHelper.RetrieveCluster(CLUSTERNAME);   
  8.  
  9.       long timestamp = DateTime.Now.Ticks;   
  10.  
  11.       byte[] key = ByteEncoderHelper.UTF8Encoder.ToByteArray(timestamp.ToString());   
  12.  
  13.       byte[] columnName = ByteEncoderHelper.UTF8Encoder.ToByteArray("timestamp");   
  14.  
  15.       byte[] columnValue = ByteEncoderHelper.LongEncoder.ToByteArray(timestamp);   
  16.  
  17.       ColumnParent columnParent = new ColumnParent()   
  18.  
  19.       {   
  20.  
  21.           Column_family = COLUMNFAMILYNAME,   
  22.  
  23.       };   
  24.  
  25.       Column columnData = new Column()   
  26.  
  27.       {   
  28.  
  29.           Name = columnName,   
  30.  
  31.           Timestamp = UnixHelper.UnixTimestamp,   
  32.  
  33.           Value = columnValue,   
  34.  
  35.       };   
  36.  
  37.       // inserting data   
  38.  
  39.       cluster.Execute(new ExecutionBlock(delegate(CassandraClient client)   
  40.  
  41.       {   
  42.  
  43.           client.insert(key, columnParent, columnData, ConsistencyLevel.ONE);   
  44.  
  45.           return null;   
  46.  
  47.       }), KEYSPACENAME);   
  48.  
  49.       return timestamp;   
  50.  
  51.   }   
Aquiles的Get操作

 

 
  
  1. public long GetData(string keyString)   
  2.  
  3.         {   
  4.  
  5.             long result = long.MinValue;   
  6.  
  7.             Aquiles.Helpers.Encoders.UTF8EncoderHelper utf8Encoder = new Aquiles.Helpers.Encoders.UTF8EncoderHelper();   
  8.  
  9.             ICluster cluster = AquilesHelper.RetrieveCluster(CLUSTERNAME);   
  10.  
  11.             byte[] key = ByteEncoderHelper.UTF8Encoder.ToByteArray(keyString);   
  12.  
  13.             byte[] columnName = ByteEncoderHelper.UTF8Encoder.ToByteArray("timestamp");   
  14.  
  15.             byte[] columnValue = ByteEncoderHelper.UTF8Encoder.ToByteArray(Guid.NewGuid().ToString());   
  16.  
  17.             ColumnPath columnPath = new ColumnPath()   
  18.  
  19.             {   
  20.  
  21.                 Column = columnName,   
  22.  
  23.                 Column_family = COLUMNFAMILYNAME,   
  24.  
  25.             };   
  26.  
  27.             ColumnOrSuperColumn columnOrSuperColumn = null;   
  28.  
  29.             // getting inserted data   
  30.  
  31.             cluster.Execute(new ExecutionBlock(delegate(CassandraClient client)   
  32.  
  33.             {   
  34.  
  35.                 columnOrSuperColumn = client.get(key, columnPath, ConsistencyLevel.ONE);   
  36.  
  37.                 return columnOrSuperColumn;   
  38.  
  39.             }), KEYSPACENAME);   
  40.  
  41.             result = ByteEncoderHelper.LongEncoder.FromByteArray(columnOrSuperColumn.Column.Value);   
  42.  
  43.             return result;   
  44.  
  45.         }   
Aquiles的删除操作

 

 
  
  1. public void DeleteData(string keyString)   
  2.  
  3.         {   
  4.  
  5.             Aquiles.Helpers.Encoders.UTF8EncoderHelper utf8Encoder = new Aquiles.Helpers.Encoders.UTF8EncoderHelper();   
  6.  
  7.             ICluster cluster = AquilesHelper.RetrieveCluster(CLUSTERNAME);   
  8.  
  9.             byte[] key = ByteEncoderHelper.UTF8Encoder.ToByteArray(keyString);   
  10.  
  11.             byte[] columnName = ByteEncoderHelper.UTF8Encoder.ToByteArray("timestamp");   
  12.  
  13.             byte[] columnValue = ByteEncoderHelper.UTF8Encoder.ToByteArray(Guid.NewGuid().ToString());   
  14.  
  15.             ColumnPath columnPath = new ColumnPath()   
  16.  
  17.             {   
  18.  
  19.                 Column = columnName,   
  20.  
  21.                 Column_family = COLUMNFAMILYNAME,   
  22.  
  23.             };   
  24.  
  25.             cluster.Execute(new ExecutionBlock(delegate(CassandraClient client)   
  26.  
  27.             {   
  28.  
  29.                 client.remove(key, columnPath,UnixHelper.UnixTimestamp, ConsistencyLevel.ONE);   
  30.  
  31.                 return null;   
  32.  
  33.             }), KEYSPACENAME);   
  34.  
  35.         }   
CQL的使用示例
 
  
  1. public string CQLTest()   
  2.  
  3.        {   
  4.  
  5.            string cql = "select * from TestColumnFamily ";   
  6.  
  7.            string result="";   
  8.  
  9.            Aquiles.Helpers.Encoders.UTF8EncoderHelper utf8Encoder = new Aquiles.Helpers.Encoders.UTF8EncoderHelper();   
  10.  
  11.            ICluster cluster = AquilesHelper.RetrieveCluster(CLUSTERNAME);   
  12.  
  13.            byte [] query=utf8Encoder.ToByteArray(cql);   
  14.  
  15.            // getting inserted data   
  16.  
  17.            CqlResult cqlResult=null;   
  18.  
  19.            cluster.Execute(new ExecutionBlock(delegate(CassandraClient client)   
  20.  
  21.            {   
  22.  
  23.                cqlResult= client.execute_cql_query(query, Compression.NONE);   
  24.  
  25.                return cqlResult;   
  26.  
  27.            }), KEYSPACENAME);   
  28.  
  29.            result = utf8Encoder.FromByteArray(cqlResult.Rows[0].Columns[0].Value);   
  30.  
  31.            return result;   
  32.  
  33.        }