package me.test;
import static com.datastax.driver.core.querybuilder.QueryBuilder.add;
import static com.datastax.driver.core.querybuilder.QueryBuilder.batch;
import static com.datastax.driver.core.querybuilder.QueryBuilder.bindMarker;
import static com.datastax.driver.core.querybuilder.QueryBuilder.desc;
import static com.datastax.driver.core.querybuilder.QueryBuilder.eq;
import static com.datastax.driver.core.querybuilder.QueryBuilder.prepend;
import static com.datastax.driver.core.querybuilder.QueryBuilder.put;
import static com.datastax.driver.core.querybuilder.QueryBuilder.set;
import static com.datastax.driver.core.querybuilder.QueryBuilder.ttl;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import com.datastax.driver.core.BatchStatement;
import com.datastax.driver.core.BoundStatement;
import com.datastax.driver.core.Cluster;
import com.datastax.driver.core.Host;
import com.datastax.driver.core.Metadata;
import com.datastax.driver.core.PreparedStatement;
import com.datastax.driver.core.RegularStatement;
import com.datastax.driver.core.ResultSet;
import com.datastax.driver.core.Row;
import com.datastax.driver.core.Session;
import com.datastax.driver.core.Statement;
import com.datastax.driver.core.policies.ConstantReconnectionPolicy;
import com.datastax.driver.core.policies.DowngradingConsistencyRetryPolicy;
import com.datastax.driver.core.querybuilder.Clause;
import com.datastax.driver.core.querybuilder.Insert;
import com.datastax.driver.core.querybuilder.QueryBuilder;
import com.datastax.driver.core.querybuilder.QueryBuilderEx;
public class Test {
public static void main(String[] args) {
Cluster cluster = Cluster.builder()
.addContactPoint("192.168.101.80")
.withPort(9042)
.withRetryPolicy(DowngradingConsistencyRetryPolicy.INSTANCE)
.withReconnectionPolicy(new ConstantReconnectionPolicy(100L))
.withCredentials("cassandra", "cassandra")
.build();
Metadata metadata = cluster.getMetadata();
System.out.printf("Connected to cluster: %s\n",
metadata.getClusterName());
for (Host host : metadata.getAllHosts()) {
System.out.printf("Datacenter: %s; Host: %s; Rack: %s\n",
host.getDatacenter(),
host.getAddress(),
host.getRack());
}
Session session = cluster.connect();
recreateKeyspace(session); // 3.948s, 4.364s
recreateTable(session); // 3.091s, 4.364s, 3.014s
insertData0(session); // 5.323s, 5.495s
// insertData1(session); // 8.034s, 5.698s, 5.77s
// insertData2(session); // 18.11s
query(session); // 1.035s, 0.761s
queryContains(session);
session.close();
cluster.close();
}
private static void recreateKeyspace(Session session) {
System.out.println("recreateKeyspace begin");
long beginTime = System.currentTimeMillis();
String cql = "drop keyspace if exists test";
session.execute(cql);
cql = "create keyspace if not exists test "
+ "with replication = { 'class' : 'SimpleStrategy', 'replication_factor' : 1 } "
+ "and durable_writes = true";
session.execute(cql);
cql = "use test";
session.execute(cql);
long endTime = System.currentTimeMillis();
double timeConsume = (endTime - beginTime) / 1000.0;
System.out.println("recreateKeyspace end : " + timeConsume + "s");
}
private static void recreateTable(Session session) {
System.out.println("recreateTable begin");
long beginTime = System.currentTimeMillis();
String cql = "drop table if exists xxx";
session.execute(cql);
cql = "create table if not exists xxx ( "
+ "id text,"
+ "sid text,"
+ "name text,"
+ "tags set<text>,"
+ "addrs list<text>,"
+ "extra map<text,text>,"
+ "memo text,"
+ "primary key(id, sid)"
+ ")";
session.execute(cql);
cql = "create index on xxx(name)";
session.execute(cql);
cql = "create index on xxx(tags)";
session.execute(cql);
cql = "create index on xxx(addrs)";
session.execute(cql);
cql = "create index on xxx(extra)";
session.execute(cql);
long endTime = System.currentTimeMillis();
double timeConsume = (endTime - beginTime) / 1000.0;
System.out.println("recreateTable end : " + timeConsume + "s");
}
// batch + prepared statement
private static void insertData0(Session session) {
System.out.println("insertData0 begin");
showMemory();
long beginTime = System.currentTimeMillis();
Insert insert = QueryBuilder
.insertInto("xxx")
// .ifNotExists()
.value("id", bindMarker())
.value("sid", bindMarker())
.value("name", bindMarker())
.value("tags", bindMarker())
.value("addrs", bindMarker())
.value("extra", bindMarker())
.value("memo", bindMarker());
PreparedStatement preStmt = session.prepare(insert.toString());
BatchStatement batchStmt = new BatchStatement();
// batch loop
for (int i = 0; i < 1000; i++) {
// inserts loop in one batch
for (int j = 0; j < 10; j++) {
int num = i * 10 + j;
String id = "0";
String sid = "sid" + num;
String name = "name" + num;
Set<String> tags = new HashSet<String>(2);
tags.add("tag" + num + ".3");
tags.add("tag" + num + ".4");
List<String> addrs = new ArrayList<String>(2);
addrs.add("addr" + num + ".3");
addrs.add("addr" + num + ".4");
Map<String, String> extra = new HashMap<String, String>(2);
extra.put("key" + num + ".3", "value" + num + ".3");
extra.put("key" + num + ".4", "value" + num + ".4");
String memo = "memo" + num;
BoundStatement boundStmt = preStmt.bind(id, sid, name, tags,
addrs, extra, memo);
batchStmt.add(boundStmt);
}
session.execute(batchStmt);
batchStmt.clear();
}
long endTime = System.currentTimeMillis();
double timeConsume = (endTime - beginTime) / 1000.0;
showMemory();
System.out.println("insertData0 end : " + timeConsume + "s");
}
// batch
private static void insertData1(Session session) {
System.out.println("insertData1 begin");
showMemory();
long beginTime = System.currentTimeMillis();
// batch loop
for (int i = 0; i < 1000; i++) {
// inserts loop in one batch
List<RegularStatement> stmtList = new ArrayList<RegularStatement>();
RegularStatement[] arr = new RegularStatement[0];
for (int j = 0; j < 10; j++) {
int num = i * 10 + j;
String id = "0";
String sid = "sid" + num;
String name = "name" + num;
Set<String> tags = new HashSet<String>(2);
tags.add("tag" + num + ".3");
tags.add("tag" + num + ".4");
List<String> addrs = new ArrayList<String>(2);
addrs.add("addr" + num + ".3");
addrs.add("addr" + num + ".4");
Map<String, String> extra = new HashMap<String, String>(2);
extra.put("key" + num + ".3", "value" + num + ".3");
extra.put("key" + num + ".4", "value" + num + ".4");
String memo = "memo" + num;
Insert insert = QueryBuilder.insertInto("xxx")
.value("id", id)
.value("sid", sid)
.value("name", name)
.value("tags", tags)
.value("addrs", addrs)
.value("extra", extra)
.value("memo", memo);
stmtList.add(insert);
}
session.execute(batch(stmtList.toArray(arr)));
}
long endTime = System.currentTimeMillis();
double timeConsume = (endTime - beginTime) / 1000.0;
showMemory();
System.out.println("insertData1 end : " + timeConsume + "s");
}
// prepared statement
private static void insertData2(Session session) {
System.out.println("insertData2 begin");
showMemory();
long beginTime = System.currentTimeMillis();
// String cql = "insert into xxx ("
// + "id,"
// + "sid,"
// + "name,"
// + "tags,"
// + "addrs,"
// + "extra,"
// + "memo"
// + ") values ( ?,?,?,?,?,?,?)";
Insert insert = QueryBuilder
.insertInto("xxx")
.value("id", bindMarker())
.value("sid", bindMarker())
.value("name", bindMarker())
.value("tags", bindMarker())
.value("addrs", bindMarker())
.value("extra", bindMarker())
.value("memo", bindMarker());
PreparedStatement preStmt = session.prepare(insert.toString());
for (int i = 0; i < 10000; i++) {
String id = "0";
String sid = "sid" + i;
String name = "name" + i;
Set<String> tags = new HashSet<String>(2);
tags.add("tag" + i + ".3");
tags.add("tag" + i + ".4");
List<String> addrs = new ArrayList<String>(2);
addrs.add("addr" + i + ".3");
addrs.add("addr" + i + ".4");
Map<String, String> extra = new HashMap<String, String>(2);
extra.put("key" + i + ".3", "value" + i + ".3");
extra.put("key" + i + ".4", "value" + i + ".4");
String memo = "memo" + i;
BoundStatement boundStmt = preStmt.bind(id, sid, name, tags, addrs,
extra, memo);
session.execute(boundStmt);
}
long endTime = System.currentTimeMillis();
double timeConsume = (endTime - beginTime) / 1000.0;
showMemory();
System.out.println("insertData2 end : " + timeConsume + "s");
}
private static void query(Session session) {
System.out.println("query begin");
showMemory();
long beginTime = System.currentTimeMillis();
Statement stmt = QueryBuilder
.select()
.all()
.from("xxx")
.where(eq("id", "0"))
.orderBy(desc("sid"))
// .limit(10)
.setFetchSize(100);
ResultSet rs = session.execute(stmt);
int i = 0;
while (!rs.isExhausted()) {
if (i < 5000) {
rs.one(); // skip first 5000
i++;
continue;
}
Row row = rs.one();
System.out.println(i + " : " + row);
if (i > 5010) {
break;
}
i++;
}
long endTime = System.currentTimeMillis();
double timeConsume = (endTime - beginTime) / 1000.0;
showMemory();
System.out.println("query end : " + timeConsume + "s");
}
private static void queryContains(Session session) {
System.out.println("queryContains begin");
showMemory();
long beginTime = System.currentTimeMillis();
Statement stmt = QueryBuilder
.select()
.all()
.from("xxx")
.where(eq("id", "0"))
.and(QueryBuilderEx.contains("tags", "tag0.3"))
// .orderBy(desc("sid"))
// .limit(10)
.setFetchSize(100);
ResultSet rs = session.execute(stmt);
int i = 0;
while (!rs.isExhausted()) {
Row row = rs.one();
System.out.println(i + " : " + row);
i++;
}
long endTime = System.currentTimeMillis();
double timeConsume = (endTime - beginTime) / 1000.0;
showMemory();
System.out.println("queryContains end : " + timeConsume + "s");
}
private static void showMemory() {
Runtime runtime = Runtime.getRuntime();
long maxMemory = runtime.maxMemory();
long allocatedMemory = runtime.totalMemory();
long freeMemory = runtime.freeMemory();
StringBuilder sb = new StringBuilder();
sb.append("jvm memory (M) : max/allocated/free = "
+ (maxMemory / 1024 / 1024)
+ "/"
+ (allocatedMemory / 1024 / 1024)
+ "/"
+ (freeMemory / 1024 / 1024));
System.out.println(sb.toString());
}
// update demo
private static void update() {
QueryBuilder
.update("xxx")
.with(set("memo", "memo2"))
.and(add("tags", "tag1"))
.and(prepend("addrs", "addr1"))
.and(put("extra", "key1", "value1"))
.where(eq("id", "99"))
.and(eq("sid", ""))
.onlyIf(eq("memo", "memo1"))
.using(ttl(10000));
}
}