使用DataStax驱动程序

时间:2015-08-09 14:55:10

标签: java python cassandra cql datastax

我有一个Cassandra进程,它是在早期的Cassandra版本中创建和定义的。到目前为止,我们使用了一个hector驱动程序来连接它。我正在将驱动程序更改为DataStax以享受CQL新功能并允许异步访问。

我在进行转换的过程中遇到了一些问题。虽然我仍然遇到一些问题,但我已经阅读this upgrade guide了解了一些问题。

最大的问题是我无法使用大于1的协议版本访问密钥空间。当我尝试以下python代码时:

cass4 = Cluster(['MyIp'])
cass4.protocol_version = 2
session = cass4.connect('myKeySpace')

此代码会产生以下错误和警告:

ERROR:cassandra.connection:Closing connection <AsyncoreConnection(4849045328) IP:9042> due to protocol error: code=000a [Protocol error] message="Invalid or unsupported protocol version: 2"
WARNING:cassandra.cluster:Downgrading core protocol version from 2 to 1 for IP
WARNING:cassandra.metadata:Building table metadata with no column meta for keyspace

使用Java驱动程序,如果我尝试连接大于1的协议版本,我只会遇到NoHostAvailableException: All host(s) tried for query failed连接错误。

此连接问题导致构建适当的Java DAO时遇到很多麻烦。例如,如果我试图进行批量更新,例如:

BatchStatment batch = new BatchStatement()
batch.add(somePreparedStatement)
cqlSession.executeAsync(batch)

我收到以下错误:

com.datastax.driver.core.exceptions.UnsupportedFeatureException: Unsupported feature with the native protocol version 1 (which is currently in use): Protocol level batching is not supported

使用cqlsh直接在集群节点上运行“BEGIN BATCH ..”操作,所以我知道这个CQL命令可以执行,但我不知道如何在Java中准备它并使用协议版本1执行它。 ,cassandra和CQL版本的集群似乎是合适的:

[cqlsh 3.1.7 | Cassandra 1.2.13.2 | CQL spec 3.0.0 | Thrift protocol 19.36.2]

所以,问题是:

  1. 为什么会这样?
  2. 我可以使用大于1的协议版本连接到该密钥空间吗?
  3. 如果没有,我可以以某种方式绕过此批量更新问题吗?

1 个答案:

答案 0 :(得分:0)

最终找到了这个问题的答案here

  

我可以合并批次和PreparedStatements吗?

     

从Cassandra 2.0和相应版本的C#开始,   Java和Python驱动程序,PreparedStatements可以批量使用   操作(在此之前,你仍然可以准备一个完整的批次   操作,但你需要知道apriori语句的数量   将包括在内。)

由于我的Cassandra版本是1.2xx,我不能使用批量更新和准备好的语句。

解决方法是将查询创建为字符串(Ya,这是脏的),然后执行字符串查询。