zoukankan      html  css  js  c++  java
  • 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#读取Excel文档
    用DataSet方式更新数据库表
    using(){},Close(),Dispose()的区别
    ADO.NET连接数据库的两种方式
    DateUtils
    GoF的23个经典设计模式
    react中需要用到【深度复制】的问题
    css区分ie8/ie9/ie10/ie11 chrome firefox的代码
    【个人学习笔记】走近H5
    【React入门实例(运行于浏览器duan)】
  • 原文地址:https://www.cnblogs.com/wggj/p/7149852.html
Copyright © 2011-2022 走看看