我在尝试将existing library从Cassandra 0.6升级到0.7 beta1时遇到了很多麻烦。我原本以为这是一个操作顺序问题,所以我决定将其分解为基础知识。
以下是我将起诉的基本设置
TTransport framedTransport = new TFramedTransport(new TSocket("localhost", 9160));
TTransport socketTransport = new TSocket("localhost", 9160);
TProtocol framedProtocol = new TBinaryProtocol(framedTransport);
TProtocol socketProtocol = new TBinaryProtocol(socketTransport);
然后我尝试通过以下方式改变客户端的设置来切换输入和输出协议:
var client = new Cassandra.Client(framedProtocol, framedProtocol); // all framed
var client = new Cassandra.Client(socketProtocol, socketProtocol); // all socket
var client = new Cassandra.Client(framedProtocol, socketProtocol); // in: framed out: socket
var client = new Cassandra.Client(socketProtocol, framedProtocol); // in: socket out: framed
然后我执行以下程序,该程序使用来自from the download的默认Cassandra配置,并且我正在执行一个简单的请求,例如计数,我希望它返回零,因为没有插入数据。
framedTransport.Open();
socketTransport.Open();
Console.WriteLine("Start");
client.set_keyspace("Keyspace1");
var key = System.Text.Encoding.ASCII.GetBytes("MyKey");
var columns = new List<byte[]>(new[] { System.Text.Encoding.ASCII.GetBytes("MyColumn") });
var column_parent = new ColumnParent {
Column_family = "Standard1"
};
var predicate = new SlicePredicate {
Column_names = columns
};
client.get_count(key, column_parent, predicate, ConsistencyLevel.ALL);
Console.WriteLine("Done");
Console.Read();
我在上面提供的4种不同设置中的每一种都无法执行。其中几个只是锁定而其他人抛出异常。所以基本上我很难尝试使用.NET框架与新的Cassandra 0.7建立连接。
以下是我发现的各种问题:
all framed
:锁定set_keyspace all socket
:抛出无效的方法名称:set_keyspace上的“set_keyspace”in: framed out: socket
:锁定set_keyspace in: socket out: framed
:锁定set_keyspace 我99%肯定它与我在Cassandra的Thrift层做的事情有关,因为我无法让这个简单的应用程序工作。但是如果你想浏览我的0.7分支,你可以在这里找到它:
答案 0 :(得分:1)
我没有更新Windows中的环境变量以指向0.7的新位置。所以它基本上运行稳定版本而不是beta版本。在我更新了环境变量以指向新位置之后,一切都重新开始了。
答案 1 :(得分:0)
可能C#thrift框架模式代码有问题,因为服务器端的所有更改都将框架设置为默认模式而不是无框架模式。您可以在cassandra.yaml中将其切换回来作为解决方法。
(在连接的输入/输出端指定不同的协议有点疯狂。没有其他我知道的Thrift语言可以做到这一点。如果你深入研究代码生成,这是可能修复的另一个问题。)