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),務必引起重視。

先寫這么多,示例代碼以后補上。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM