標籤:log 搜尋 expect automake 拷貝 tar 基礎 系統內容 接下來
一 前言
在項目將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
從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
從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/
四 開發時注意事項
libcassandra的API都以標準C的結構和函數形式提供,而不是C++形式的類和方法。不過與thrift形式的介面相比,libcassandra的API與Java API更相似,開發時可參考Java API找到相應的函數,再按cassandra.h的說明進行改造。
libcassandra使用的大多數結構,除少數,使用完後都必須釋放記憶體,因此必須重視以避免造成記憶體流失。
這點與在Java API一致,在bind和get時,參數與列類型是嚴格匹配的,不允許隱式的類型轉換(例如int32與int64),務必引起重視。
先寫這麼多,範例程式碼以後補上。
C/C++開發Cassandra的一些經驗