新的Cassandra项目 - Astyanax还是Java驱动程序?

16
我正在使用Cassandra开始一个新项目(计划使用最新的稳定版本1.2.x)。我尝试了几个不同的Java库,如Hector, Astyanax, Cassandra-jdbc...
在它们中间,(简而言之)我的选择是Astyanax。但后来我也发现并尝试了DataStax的Java驱动程序,它支持新的CQL二进制协议,如果你只使用CQL,则更加干净。看起来1.0.0 GA版本很快就会发布。
你会推荐哪一个?谢谢。

2
+1 给 Astyanax!太棒了的 API! - Rajat Gupta
5个回答

14

我建议你使用基于cql3的驱动程序。一些选择是JDBC driver 或者更好的Datastax's driver,它支持异步连接。你可能需要自己构建Datastax的驱动程序,但可以使用maven轻松完成。

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

 

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

   

- 来源

此外,CQL的性能正在迅速提高。这里有一些过时的基准测试。
更新

由于驱动程序的maven中央仓库已创建,因此现在只需将其添加到maven依赖项中即可使用它:

<dependency>
    <groupId>com.datastax.cassandra</groupId>
    <artifactId>cassandra-driver-parent</artifactId>
    <version>1.0.0</version>
</dependency>

9
我个人使用过Hector、Astyanax、Pelops、Fluent Cassandra、Datastax的Driver和Pycassa,经过使用这么多API后,我终于意识到Astyanax最适合我(这是我的个人考虑)。
我在astyanax中发现的特点与其他API有所不同,包括:
- API易于使用 - 支持复合列 - 连接池 - 延迟 - 文档 - 更新

8
Hector和Datastax的驱动支持复合列(其他驱动不确定),我认为CQL比Astyanax更容易使用。另外,Thrift正在退出舞台,因此新项目应该使用CQL3。 - Lyuben Todorov
2
我知道,其实我的考虑是关于易用性的。是的,CQL一直是更容易的选择,并且将保持这样(这是众所周知的关系型数据库背景),我可以保证,即使大多数Astyanax用户也会从他们的API中使用CQL语句。 - abhi
9
支持 Astyanax。CQL并不更容易 - 它只是看起来如此:你可以简单地编写未执行的查询,但可能会遇到麻烦,因为它让你认为它是关系型数据库,并且不强制你真正理解 nosql 存储的语义。 - Maciej Miklas
@MaciejMiklas,你试过使用二进制驱动程序吗?你可以用四行代码构建查询。 - user2003470

6

我使用过Astyanax。它有很好的文档和易于使用,只要你写的代码比CQL多五倍以上没有问题。

目前我正在使用CQL,因为我合作的人还没有完全掌握Astyanax的代码 - 他们为什么要为列名编写类。我认为如果不使用Astyanax或Hector,您永远不会正确地理解Cassandra的内部机制。


4
你应该选择全新的DataStax Java Driver和Cassandra 1.2来启动一个新项目。这个驱动程序刚刚发布了GA版本,而且在你开发新项目的几个月内,这个驱动程序和Cassandra 1.2都将变得更加稳定。请务必选择它们。

1

我同意Zanson/Valchkou的观点。DataStax Java Driver是未来的趋势。使用SQL操作Cassandra非常方便。同时,我也推荐CassandraExecutor,它是DataStax Java Driver的简单包装器。相比Java Driver,CassandraExecutor具有以下功能:

  • 一致/集成/简洁的API(同步/异步)操作(CRUD)与SQL/entity。
  • 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的开发者。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接