16

我正在使用 Cassandra 开始一个新项目(并计划使用最新的稳定 (1.2.x) 版本)。我尝试了几个不同的 Java 库,比如HectorAstyanax、Cassandra-jdbc...

其中,(简而言之)我的选择是Astyanax。但后来我也找到并尝试了 DataStax 的 Java 驱动程序,它支持新的 CQL 二进制协议,如果你只使用 CQL 会更干净。看来 1.0.0 GA 版本即将发布。

你会推荐哪一个?谢谢。

4

5 回答 5

19

我建议您使用基于 cql3 的驱动程序。一些选择是JDBC 驱动程序,甚至更好的支持异步连接的 Datastax 驱动程序。您可能必须自己构建 datastax 的驱动程序,但这可以使用 maven 轻松完成。

Thrift 不会在 Cassandra 中获得任何新功能,它是为了向后可比性而保留的,并且大多数 C* 社区成员建议在新项目中使用基于 cql 的驱动程序:

如上所述,我们认为对于 Cassandra,CQL3 是一个比 thrift API 更简单且整体更好的 API。因此,鼓励新项目/应用程序使用 CQL3

-来源

CQL 的性能也正在迅速提高。以下是一些过时的基准。
更新

由于编写了答案,因此为驱动程序创建了一个maven 中央存储库,所以现在要使用它只需将依赖项添加到 maven:

<dependency>
    <groupId>com.datastax.cassandra</groupId>
    <artifactId>cassandra-driver-parent</artifactId>
    <version>1.0.0</version>
</dependency>
于 2013-04-18T23:51:51.543 回答
9

我个人使用过 Hector、Astyanax、Pelops、Fluent Cassandra、Datastax 的 Driver 和 Pycassa,在使用了这么多 API 之后,我终于意识到 Astyanax 最适合我(这是我个人的考虑)。

我在 astyanax 中发现的将其与联盟中其他人区分开来的功能是

  • API 的易用性
  • 复合柱支撑
  • 连接池
  • 潜伏
  • 文档
  • 更新
于 2013-04-19T06:33:49.540 回答
6

我用过Astyanax。只要您编写的代码比 CQL 多 5 倍,它就有很好的文档且易于使用。

现在我正在使用 CQL,因为与我共事过的人还没有完全掌握 Astyanax 代码 - 为什么他们必须为列名编写类。我认为如果您不使用 Astyanax 或 Hector,您将永远无法正确理解 Cassandra 的内部结构。

于 2013-05-21T18:54:36.663 回答
4

对于刚刚开始的新项目,您绝对应该使用新的DataStax Java 驱动程序和 Cassandra 1.2。驱动程序刚刚发布 GA,随着您开发新项目,驱动程序和 Cassandra 1.2 只会在接下来的几个月内变得更加稳定。

于 2013-05-24T20:34:30.870 回答
1

我同意赞森/瓦尔奇库的观点。DataStax Java 驱动程序是未来。用 SQL 操作 Cassandra 非常方便。同时,我也推荐CassandraExecutor ,一个DataStax Java Driver的简单包装器。与 Java Driver 相比,CassandraExecutor 具有以下特点:

  • 具有 SQL/实体的(同步/异步)操作 (CRUD) 的一致/集成/简洁 API。
  • DataSet,支持 distinct/merge/sort/groupBy/join/union/unionAll/except/intersect/paginate/filter/count/toJOSN/toXML/toCVS...

这是一个简单的 CRUD(创建/读取/更新/删除)示例:

Account account = createAccount();
// create
String sql_insert = NE.insert(ID, GUI, FIRST_NAME, LAST_NAME, LAST_UPDATE_TIME, CREATE_TIME).into(Account.class).sql();
cassandraExecutor.execute(sql_insert, account);

// read
String sql_selectByGUI = NE.select(ID, GUI, FIRST_NAME, LAST_NAME).from(Account._).where(L.eq(ID, L.QME)).sql();
Account dbAccount = cassandraExecutor.queryForEntity(Account.class, sql_selectByGUI, account);

// update
String sql_updateByLastName = NE.update(Account.class).set(FIRST_NAME).where(L.eq(ID, L.QME)).sql();

dbAccount.setFirstName("newFirstName");
cassandraExecutor.execute(sql_updateByLastName, dbAccount);

// delete
String sql_deleteByFirstName = NE.deleteFrom(Account.class).where(L.eq(ID, L.QME)).sql();
cassandraExecutor.execute(sql_deleteByFirstName, dbAccount);

(声明:我是CassandraExecutor的开发者)

于 2015-12-22T07:36:51.310 回答