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),务必引起重视。
先写这么多,示例代码以后补上。