前几天弄了0.6.8想凑合着先用,后来发现没有能够方便添加keyspace和col family的特性,就转向0.7了
run cassandra in eclipse的问题照着官方文档走就应该没有问题的...
http://wiki.apache.org/cassandra/RunningCassandraInEclipse
http://sunmoonone.iteye.com/blog/644022
关于CLI的使用,先手动添加一个keyspace - keysp1,CF是student
http://wiki.apache.org/cassandra/CassandraCli
代码上是拿原来的sample改的,有些注释过来了
package atest;
import org.apache.cassandra.thrift.Cassandra;
import org.apache.cassandra.thrift.Column;
import org.apache.cassandra.thrift.ColumnParent;
import org.apache.cassandra.thrift.ColumnPath;
import org.apache.cassandra.thrift.ConsistencyLevel;
import org.apache.cassandra.thrift.InvalidRequestException;
import org.apache.cassandra.thrift.NotFoundException;
import org.apache.cassandra.thrift.TimedOutException;
import org.apache.cassandra.thrift.UnavailableException;
import org.apache.thrift.TException;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.transport.TFramedTransport;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;
import common.test.Translater;
public class SampleOne {
static Cassandra.Client cassandraClient;
static TTransport socket;
private static void init(String keySpace) throws InvalidRequestException, TException {
// String server = "192.168.1.129";
String server = "localhost";
int port = 9160;
/* 首先指定cassandra server的地址 */
socket = new TSocket(server, port);
System.out.println(" connected to " + server + ":" + port + ".");
TFramedTransport transport = new TFramedTransport(socket);
/* 指定通信协议为二进制流协议 */
TBinaryProtocol binaryProtocol = new TBinaryProtocol(transport);
cassandraClient = new Cassandra.Client(binaryProtocol);
/* 建立通信连接 */
socket.open();
cassandraClient.set_keyspace(keySpace);
}
public static void main(String[] args) throws TException, TimedOutException, InvalidRequestException, UnavailableException, NotFoundException {
/* 选择需要操作的Keyspaces, 可以理解成数据库的表 */
String keyspace= "keysp1";
/* 初始化连接 */
init(keyspace);
String row = "employee";
/* 创建一个Table Name */
String tableName = "student";
/* 插入一条记录 */
insertOrUpdate(tableName,row,"name","happy birthday!",System.currentTimeMillis());
/* 删除一条记录 */
//delete(keyspace,tableName,row,"name",System.currentTimeMillis());
/* 获取一条记录 (由于插入和删除是同一条记录,有可能会检索不到哦!请大家主意!*/
Column column = getByColumn(tableName,row,"name", System.currentTimeMillis());
System.out.println("read row " + row);
System.out.println("column name " + ":" + new String(column.getName()));
System.out.println("column value" + ":" + new String(column.getValue()));
System.out.println("column timestamp" + ":" + (column.timestamp));
close();
}
/**
* 插入记录
*/
public static void insertOrUpdate(String tableName, String rowParam,String ColumnName,String ColumnValue,long timeStamp)
throws TException, TimedOutException, InvalidRequestException, UnavailableException, NotFoundException{
/* 数据所在的行标 */
String row = rowParam;
/* 创建一个column path */
ColumnParent parent = new ColumnParent(tableName);
Column col = new Column();
col.setName(ColumnName.getBytes());
col.setValue(ColumnValue.getBytes());
/* 执行插入操作,指定keysapce, row, col, 和数据内容, 后面两个参数一个是timestamp, 另外一个是consistency_level
* timestamp是用来做数据一致性保证的, 而consistency_level是用来控制数据分布的策略,前者的理论依据是bigtable, 后者的理论依据是dynamo
*/
cassandraClient.insert(Translater.toByteBuffer(row), parent, col, ConsistencyLevel.ONE);
}
/**
* 删除记录
*/
public static void delete(String tableName, String rowParam,String ColumnName,long timeStamp)
throws TException, TimedOutException, InvalidRequestException, UnavailableException, NotFoundException{
/* 选择需要操作的Keyspaces, 存放数据表所在的空间位置 */
/* 数据所在的行标 */
String row = rowParam;
/* 创建一个column path */
ColumnPath col = new ColumnPath(tableName);
col.setColumn(ColumnName.getBytes());
/* 执行删除操作,指定keysapce, row, col, 后面两个参数一个是timestamp, 另外一个是consistency_level
* timestamp是用来做数据一致性保证的, 而consistency_level是用来控制数据分布的策略,前者的理论依据是bigtable, 后者的理论依据是dynamo
*/
cassandraClient.remove(Translater.toByteBuffer(row), col, System.currentTimeMillis(), ConsistencyLevel.ONE);
}
/**
* 获取数据
*/
public static Column getByColumn(String tableName, String rowParam,String ColumnName,long timeStamp)
throws TException, TimedOutException, InvalidRequestException, UnavailableException, NotFoundException{
/* 创建一个column path */
ColumnPath col = new ColumnPath(tableName);
col.setColumn(ColumnName.getBytes());
/* 执行查询操作,指定keysapce, row, col, timestamp
* timestamp是用来做数据一致性保证的, 而consistency_level是用来控制数据分布的策略,前者的理论依据是bigtable, 后者的理论依据是dynamo
*/
Column column = cassandraClient.get(Translater.toByteBuffer(rowParam), col, ConsistencyLevel.ONE).column;
return column;
}
/**
* 关闭当前的远程访问连接
*/
public static void close() {
socket.close();
}
}
Translater的代码
package common.test;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.nio.charset.CharsetEncoder;
public class Translater {
public static Charset charset = Charset.forName("UTF-8");
public static CharsetEncoder encoder = charset.newEncoder();
public static CharsetDecoder decoder = charset.newDecoder();
public static ByteBuffer toByteBuffer(String msg) {
try {
return encoder.encode(CharBuffer.wrap(msg));
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static String toString(ByteBuffer buffer) {
String data = "";
try {
int old_position = buffer.position();
data = decoder.decode(buffer).toString();
// reset buffer's position to its original so it is not altered:
buffer.position(old_position);
} catch (Exception e) {
e.printStackTrace();
return "";
}
return data;
}
}
其实关于连接的几行代码还是不准确,自己太菜了,继续上链接
http://rucbing.iteye.com/blog/789229