连接到0.7英寸.NET的Cassandra
我在尝试从Cassandra 0.6升级到0.7 beta1时遇到了很多麻烦。我原本以为这是一个操作顺序的问题,所以我决定将其分解为基本问题 这是我将要起诉的基本设置连接到0.7英寸.NET的Cassandra,.net,cassandra,thrift,cassandra-0.7,fluentcassandra,.net,Cassandra,Thrift,Cassandra 0.7,Fluentcassandra,我在尝试从Cassandra 0.6升级到0.7 beta1时遇到了很多麻烦。我原本以为这是一个操作顺序的问题,所以我决定将其分解为基本问题 这是我将要起诉的基本设置 TTransport framedTransport = new TFramedTransport(new TSocket("localhost", 9160)); TTransport socketTransport = new TSocket("localhost", 9160); TProtocol framedProtoc
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
然后我执行下面的程序,使用默认的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();
framedTransport.Open();
socketTransport.Open();
控制台写入线(“开始”);
客户端。设置密钥空间(“密钥空间1”);
var key=System.Text.Encoding.ASCII.GetBytes(“MyKey”);
var columns=new List(new[]{System.Text.Encoding.ASCII.GetBytes(“MyColumn”)});
var column\u parent=新ColumnParent{
列_family=“标准1”
};
var谓词=新谓词{
列名称=列
};
获取计数(键、列、父项、谓词、ConsistenceLevel.ALL);
控制台。写入线(“完成”);
Console.Read();
我上面提供的4种不同设置都无法执行。他们中的一些人刚刚锁定,其他人抛出了一个异常。因此,基本上我一直在尝试与新的Cassandra 0.7和.NET框架建立连接
以下是我发现的每个问题的类型:
:锁定设置键空间全框
:在set\u keyspace上抛出无效的方法名称:“set\u keyspace”all socket
:锁定设置键空间in:framed out:socket
:锁定设置键空间in:socket out:framed
(在连接的输入/输出端指定不同的协议有点疯狂。我知道没有其他节约语言会这样做。如果你深入研究代码生成,这是另一件可能需要修复的事情。)我没有更新Windows中的环境变量以指向0.7的新位置。因此,它基本上运行的是稳定版本,而不是测试版。在我更新环境变量以指向新位置后,一切又开始工作。我没有在Windows中更新环境变量以指向新位置0.7。因此,它基本上运行的是稳定版本,而不是测试版。在我将环境变量更新为指向新位置后,一切都重新开始工作。Thrift客户端代码自0.2以来大部分时间没有更改。此外,输入和输出是0.7的新添加,允许您使用不同的服务器进行写入和读取。所以我只是利用这一点来测试我的代码,看看是否有区别。但不管怎样,我发现了问题所在。因为我尝试了0.7,所以我把它放在了一个不同的路径中,但我没有做的是将环境变量注册到我正在使用的新路径中。所以在那之后,一切都起了作用。我想是眼不见心不烦了。自0.2以来,节俭客户端代码大部分都没有改变。此外,输入和输出是0.7的新添加,允许您使用不同的服务器进行写入和读取。所以我只是利用这一点来测试我的代码,看看是否有区别。但不管怎样,我发现了问题所在。因为我尝试了0.7,所以我把它放在了一个不同的路径中,但我没有做的是将环境变量注册到我正在使用的新路径中。所以在那之后,一切都起了作用。“看不见,想不起来。”运行cassandra是你的错,你对jbellis的答案投了-1票,而他提到了连接到0.7时最常见的情况?顺便说一句,不要使用环境变量。除了使用环境变量之外,没有其他方法可以轻松启动cassandra批处理文件。杰贝利斯被否决了,因为他所说的一切都是个人意见,根本没有事实根据。C#Thrift代码不是有缺陷的,它是Thrift中没有经历过从0.2到0.4任何更改的库之一。其次,为输入和输出指定不同的协议并不疯狂,特别是如果您想使用不同的服务器进行读写。它被否决了,因为它没有一个是基于事实的。顺便说一句,你不应该使用投票系统进行恶意行为。顺便说一句,如果你想抱怨在Windows平台上使用环境变量,我同意你的看法。在这里提交所有的抱怨,在C#版本的节俭中,人们称之为bug,通常是他们对大端和小端缺乏理解。NET framework同时支持这两种语言,Java只支持Big-Endian,因此如果他们的机器使用Little-Endian向基于Java的Cassandra发送数据,那么Big-Endian的类型将不匹配。我曾将其视为一个Bug,但这并不是因为Thrift是一个独立于语言的协议,所以它在传输数据时不应该关心Big和Little-Endian。另一个原因是我否决了杰贝利斯,因为他传播了错误的信息