我正在使用 Cassandra 开始一个新项目(并计划使用最新的稳定 (1.2.x) 版本)。我尝试了几个不同的 Java 库,比如Hector、Astyanax、Cassandra-jdbc...
其中,(简而言之)我的选择是Astyanax。但后来我也找到并尝试了 DataStax 的 Java 驱动程序,它支持新的 CQL 二进制协议,如果你只使用 CQL 会更干净。看来 1.0.0 GA 版本即将发布。
你会推荐哪一个?谢谢。
我建议您使用基于 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>
我个人使用过 Hector、Astyanax、Pelops、Fluent Cassandra、Datastax 的 Driver 和 Pycassa,在使用了这么多 API 之后,我终于意识到 Astyanax 最适合我(这是我个人的考虑)。
我在 astyanax 中发现的将其与联盟中其他人区分开来的功能是
我用过Astyanax。只要您编写的代码比 CQL 多 5 倍,它就有很好的文档且易于使用。
现在我正在使用 CQL,因为与我共事过的人还没有完全掌握 Astyanax 代码 - 为什么他们必须为列名编写类。我认为如果您不使用 Astyanax 或 Hector,您将永远无法正确理解 Cassandra 的内部结构。
对于刚刚开始的新项目,您绝对应该使用新的DataStax Java 驱动程序和 Cassandra 1.2。驱动程序刚刚发布 GA,随着您开发新项目,驱动程序和 Cassandra 1.2 只会在接下来的几个月内变得更加稳定。
我同意赞森/瓦尔奇库的观点。DataStax Java 驱动程序是未来。用 SQL 操作 Cassandra 非常方便。同时,我也推荐CassandraExecutor ,一个DataStax Java Driver的简单包装器。与 Java Driver 相比,CassandraExecutor 具有以下特点:
这是一个简单的 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的开发者)