一 前言
在項目將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),務必引起重視。
先寫這么多,示例代碼以后補上。