首页 > 代码库 > C/C++开发Cassandra的一些经验

C/C++开发Cassandra的一些经验

一 前言

在项目将Cassandra作为备选环境之后,就开始考虑用C/C++进行开发。根据资料,目前Cassandra的C/C++接口,主要有thrift和libcassandra两种,官方网址分别为:

thrift: https://github.com/packaged/cassandrathrift

libcassandra:http://datastax.github.io/cpp-driver/

 

二 C/C++的thrift API

一开始我们采用的是thrift接口,毕竟thrift提供了多语言的相同接口。Cassandra安装、编译thrift接口也算简单,作为生手的我用一两个小时搞定了,具体可参见:

 《cassandra的c++ driver》: http://blog.chinaunix.net/uid-12023855-id-3431018.html

但在开发时,却遇到了很头疼的麻烦,即“Exception: Default TException.  [Expected 4 or 0 byte int (1)]

在搜索到这篇博客:《关于Cassandra与Thrift在int/text/varint上的暧昧》后,因不能将表的clolumn类型由int修改为text或varint,只能放弃thrift。

私下以为,cassandra对类型匹配要求很严格,而提供的thrift接口却均以text为基础类型,是不是说明cassandra官方其实并不重视这种方式?

当然,如果环境中column的类型都可改为text,或者对thrift本省很熟悉,还是可以继续在这条路走下去的。

 

三 libcassandra编译安装

接下来重点介绍libcassandra,在CentOS的编译安装步骤如下:

  • 安装依赖包

sudo yum install automake cmake gcc-c++ git libtool openssl-devel

  • 编译安装libuv

从github(https://github.com/libuv/libuv/tree/v1.x)下载最新的源码安装包libuv-1.x.zip:

unzip libuv-1.x.zip

cd libuv-1.x

sh ./autogem.sh

./configure

sudo make install

  • 修改链接库目录

libuv(以及其它编译安装的库)的缺省安装目录为/usr/local/lib,不在系统的默认搜寻范围内。有两种方式修改,一种是设置系统环境参数LD_LIBRARY_PATH,另一种是修改配置文件/etc/ld.so.conf,这里采用第二种。

sudo echo "/usr/local/mysql/lib" >> /etc/ld.so.conf

sudo ldconfig

  • 编译安装cpp-driver

从github(https://github.com/datastax/cpp-driver)下载最新的源码安装包cpp-driver-master.zip:

unzip cpp-driver-master.zip

cd cpp-driver-master

cmake .

make

  • 生成的头文件和共享库文件在本目录,最好拷贝到/usr/local/相应目录下:

cp ./libcassandra* /usr/local/lib

cp ./include/cassandra.h /usr/local/include/

 

四 开发时注意事项

  • 标准C类型的API

libcassandra的API都以标准C的结构和函数形式提供,而不是C++形式的类和方法。不过与thrift形式的接口相比,libcassandra的API与Java API更相似,开发时可参考Java API找到相应的函数,再按cassandra.h的说明进行改造。

  • 避免内存泄漏

libcassandra使用的大多数结构,除少数,使用完后都必须释放内存,因此必须重视以避免造成内存泄漏。

  • 类型严格匹配

这点与在Java API一致,在bind和get时,参数与列类型是严格匹配的,不允许隐式的类型转换(例如int32与int64),务必引起重视。

先写这么多,示例代码以后补上。

C/C++开发Cassandra的一些经验