cassandra在服务端像leveldb一样进行插入初试成功
Posted longbigfish
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cassandra在服务端像leveldb一样进行插入初试成功相关的知识,希望对你有一定的参考价值。
经过研究,决定在 cql3/QueryProcessor.java 里面下手。
这里有两个函数,第一个是
public ResultMessage process(String queryString, QueryState queryState, QueryOptions options, long queryStartNanoTime)
该函数接受到 String 类型的sql语句,进行规整处理(判断是否合法),然后 调用 函数
processStatement(prepared, queryState, options, queryStartNanoTime);
进行具体的处理。
我们在同一个类里面建立bench函数
public void Bench(String queryString, QueryState queryState, QueryOptions options, long queryStartNanoTime)
在 process 函数开始时调用bench函数。
但是注意:如果不加处理,cassandra启动后会陷入某种无限循环导致一直无法进入服务状态(客户端无法操作数据库)
因此,在调用 bench 之前,加入if语句,判断如果 queryString 中含有某字符(bench)再调用bench函数。
注意需要将判断语句放在开始,这样可以使用任意的 query语句触发bench函数。否则如果放在后面,如果query语句非法,规整处理会直接返回。
bench函数被调用后,可以更改传递过来的 sql语句,然后调用
processStatement
完成处理。
测试:在bench函数中使用insert语句,结果插入成功。
------------------------------问题
只能插入一条,如果插入多条的话,会发生错误。
WriteTimeout: Error from server: code=1100 [Coordinator node timed out waiting for replica nodes‘ responses] message="Operation timed out - received only 0 responses." info={‘received_responses‘: 0, ‘required_responses‘: 1, ‘consistency‘: ‘ONE‘}
以上是关于cassandra在服务端像leveldb一样进行插入初试成功的主要内容,如果未能解决你的问题,请参考以下文章
如何从 cassandra 或 hbase 中提取 leveldb 类型的数据存储(sstable + memtable)?
在 OpenSuse 上将 Cassandra 作为服务运行
ledisDB底层实现——本质上就是用leveldb这样的底层存储,和ssdb一样,meta里存的是hashlist等的元数据