Cassandra3.9版本Java驱动Datastax Java Driver使用手册1-数据库连接

来源:互联网 发布:喀秋莎录屏软件破解版 编辑:程序博客网 时间:2024/05/16 00:32

所需jar包:http://download.csdn.net/detail/nangongyanya/9738844

package com.cassandra;import com.datastax.driver.core.Cluster;import com.datastax.driver.core.ResultSet;import com.datastax.driver.core.Row;import com.datastax.driver.core.Session;public class Connect {// 此示例使用同步API,需要下载额外的Guava.jarpublic static void main(String[] args) {Cluster cluster = null;try {// Cluster对象是驱动程序的主入口点。 它保存了实际Cassandra集群(特别是元数据)的已知状态。// 这个类是线程安全的,你应该创建一个单独的实例(每个目标Cassandra集群),并在你的应用程序中共享它;cluster = Cluster.builder().addContactPoint("127.0.0.1").build();// Session用来执行查询。 同样,它是线程安全的,应该重复使用;Session session = cluster.connect();// 我们使用execute来向Cassandra发送查询。 这将返回一个ResultSet,它本质上是一个Row对象的集合。// 在下一行,我们提取第一行(在这种情况下是唯一的一行);ResultSet rs = session.execute("select release_version from system.local");Row row = rs.one();// 我们从行中提取第一个(和唯一的)列的值;System.out.println(row.getString("release_version"));} finally {if (cluster != null)// 最后,我们在完成后关闭集群。 这也将关闭从此群集创建的任何会话。// 此步骤很重要,因为它释放了底层资源(TCP连接,线程池...)。// 在实际应用程序中,通常在关闭时执行此操作(例如,取消部署webapp时)。cluster.close(); }}}


cluster初始化
最简单的方法是使用Cluster.Builder进行编程,它提供了流畅的API:
Cluster cluster = Cluster.builder()        .withClusterName("myCluster")        .addContactPoint("127.0.0.1")        .build();

如果希望从外部源(如属性文件或Web服务)检索设置。 您需要提供加载这些设置的Initializer的实现:
Initializer myInitializer = ... // your implementationCluster cluster = Cluster.buildFrom(myInitializer);

新建的集群实例不会自动初始化; 将由以下操作之一触发:
     显式调用cluster.init();
     调用cluster.getMetadata();
     创建与cluster.connect()或其变体之一的会话;
     在使用cluster.newSession()创建的会话上调用session.init()。

初始化顺序如下:
     初始化内部状态(线程池,实用程序组件等);
     请尝试按顺序连接到每个接触点。 该顺序不是完全确定的(实际上,如果大量客户端共享相同的接触点,则驱动程序会打乱列表以避免热点)。 如果没有联系点回复,则抛出NoHostAvailableException,并且进程在此停止;
     否则,选择成功的联络点作为控制主机。 驱动程序与它协商本机协议版本,并查询其系统表以发现其他主机的地址。
注意,在这个阶段,只有控制连接已经建立。 只有在创建会话时才会打开与其他主机的连接。

session
默认情况下,会话不绑定到任何特定的键空间。 您需要在查询中为表格名称添加前缀:
Session session = cluster.connect();session.execute("select * from myKeyspace.myTable where id = 1");

您还可以在构建时指定键空间名称,当表名称不合格时,将用作默认值:
Session session = cluster.connect("myKeyspace");session.execute("select * from myTable where id = 1");session.execute("select * from otherKeyspace.otherTable where id = 1");

当前存在对命名会话的已知限制,其导致驱动程序在某些情况下意外地阻止调用线程; 如果使用完全异步模型,应该使用没有键空间的会话。
如果会话由多个线程共享,在运行时切换键空间很容易导致意外的查询失败。
一般来说,推荐的方法是使用没有键空间的单个会话,并在所有查询前面加上前缀。

执行查询
您使用会话的execute方法运行查询:
ResultSet rs = session.execute("select release_version from system.local");

执行execute会生成ResultSet,它是Row的可迭代集合。 处理所有行的基本方法是使用Java的for-each循环:
for (Row row : rs) {    // process the row}

当你知道只有一行(或者只对第一行感兴趣)时,驱动程序提供了一个方便的方法:
Row row = rs.one();

Row提供getter来提取列值; 它们可以通过位置或名称来获取:
Row row = session.execute("select first_name, last_name from users where id = 1").one();// The two are equivalent:String firstName = row.getString(0);String firstName = row.getString("first_name");

要区分NULL和实际值,请使用isNull:
Integer age = row.isNull("age") ? null : row.getInt("age");

为了确保类型安全,收集的获取使用getter。 调用方法时,需要提供与您的CQL类型匹配的类型参数:
// Assuming given_names is a list<text>:List<String> givenNames = row.getList("given_names", String.class);

对于嵌套集合,元素类型是通用的,不能表示为Java类实例。 我们使用Guava的TypeToken:
// Assuming teams is a set<list<text>>:TypeToken<List<String>> listOfStrings = new TypeToken<List<String>>() {};Set<List<String>> teams = row.getSet("teams", listOfStrings);

Row提供了一个API来在运行时浏览列元数据:
for (ColumnDefinitions.Definition definition : row.getColumnDefinitions()) {    System.out.printf("Column %s has type %s%n",            definition.getName(),            definition.getType());}

CQL数据类型Java数据类型的对应关系表
CQL3 data typeGetter nameJava typeasciigetStringjava.lang.StringbigintgetLonglongblobgetBytesjava.nio.ByteBufferbooleangetBoolbooleancountergetLonglongdategetDateLocalDatedecimalgetDecimaljava.math.BigDecimaldoublegetDoubledoublefloatgetFloatfloatinetgetInetjava.net.InetAddressintgetIntintlistgetListjava.util.ListmapgetMapjava.util.MapsetgetSetjava.util.SetsmallintgetShortshorttextgetStringjava.lang.StringtimegetTimelongtimestampgetTimestampjava.util.DatetimeuuidgetUUIDjava.util.UUIDtinyintgetBytebytetuplegetTupleValueTupleValueuser-defined typesgetUDTValueUDTValueuuidgetUUIDjava.util.UUIDvarchargetStringjava.lang.StringvarintgetVarintjava.math.BigInteger


1 0