从Java连接到Cassandra

在我的帖子Hello Cassandra中 ,我研究了如何下载Cassandra NoSQL数据库并使用cqlsh连接到Cassandra数据库。 在本文中,我将介绍从Java客户端连接到Cassandra数据库的基础知识。

尽管有几种可用于从Java访问Cassandra数据库的 框架 ,但我将在本文中使用DataStax Java Client JAR 。 GitHub上提供了适用于 Apache Cassandra的DataStax Java驱动程序 。 datastax / java-driver GitHub项目页面指出,它是“ Apache Cassandra的Java客户端驱动程序”,“仅与Cassandra查询语言版本3( CQL3 )配合使用”,并且“已获得Apache许可,版本为2.0” 。


Apache Cassandra的Java驱动程序2.0页面提供了有关该驱动程序的高级概述和体系结构详细信息 。 它的“ 编写您的第一个客户端”部分提供了代码清单和说明,这些清单和说明涉及使用Java驱动程序连接到Cassandra以及从Java代码执行CQL语句 。 这篇文章中的代码清单是适用于我的示例案例的那些示例的改编。

Cassandra Java驱动程序具有多个依赖项 。 适用于Apache Cassandra的Java Driver 2.0 文档包括一个名为“ 设置Java开发环境”的页面,该页面概述了Java Driver 2.0的依赖项 : cassandra-driver-core-2.0.1.jar ( datastax / java-driver 2.0 ), netty- 3.9.0-Final.jar ( 网状 直接 ), 番石榴16.0.1.jar ( 番石榴16 直接 ), 度量核-3.0.2.jar ( 度量核心 ),以及SLF4J-API-1.7.5.jar ( slf4j direct )。 我还发现我需要将LZ4Factory.java和snappy -java放在类路径上。

下一个代码清单是一个名为CassandraConnector的简单类。

CassandraConnector.java

package com.marxmart.persistence;import com.datastax.driver.core.Cluster;
import com.datastax.driver.core.Host;
import com.datastax.driver.core.Metadata;
import com.datastax.driver.core.Session;import static java.lang.System.out;/*** Class used for connecting to Cassandra database.*/
public class CassandraConnector
{/** Cassandra Cluster. */private Cluster cluster;/** Cassandra Session. */private Session session;/*** Connect to Cassandra Cluster specified by provided node IP* address and port number.** @param node Cluster node IP address.* @param port Port of cluster host.*/public void connect(final String node, final int port){this.cluster = Cluster.builder().addContactPoint(node).withPort(port).build();final Metadata metadata = cluster.getMetadata();out.printf("Connected to cluster: %s\n", metadata.getClusterName());for (final Host host : metadata.getAllHosts()){out.printf("Datacenter: %s; Host: %s; Rack: %s\n",host.getDatacenter(), host.getAddress(), host.getRack());}session = cluster.connect();}/*** Provide my Session.** @return My session.*/public Session getSession(){return this.session;}/** Close cluster. */public void close(){cluster.close();}
}

如下面的代码清单所示,可以调用上述连接类。

使用CassandraConnector编码

/*** Main function for demonstrating connecting to Cassandra with host and port.** @param args Command-line arguments; first argument, if provided, is the*    host and second argument, if provided, is the port.*/
public static void main(final String[] args)
{final CassandraConnector client = new CassandraConnector();final String ipAddress = args.length > 0 ? args[0] : "localhost";final int port = args.length > 1 ? Integer.parseInt(args[1]) : 9042;out.println("Connecting to IP Address " + ipAddress + ":" + port + "...");client.connect(ipAddress, port);client.close();
}

最后一个代码中的示例代码指定了默认节点和localhost端口以及端口9042 。 该端口号在apache-cassandra / conf目录中的cassandra.yaml文件中指定。 Cassandra 1.2文档在cassandra.yaml配置文件上有一个页面, 该页面将cassandra.yaml文件描述为“ Cassandra的主要配置文件”。 顺便提一句,该目录中的另一个重要配置文件是cassandra-env.sh ,它为基于Java的 Cassandra数据库定义了许多JVM选项。

对于本文中的示例,我将使用通过以下Cassandra查询语言(CQL)创建的MOVIES表:

createMovie.cql

CREATE TABLE movies
(title varchar,year int,description varchar,mmpa_rating varchar,dustin_rating varchar,PRIMARY KEY (title, year)
);

可以使用命令source 'C:\cassandra\cql\examples\createMovie.cql'在cqlsh中执行以上文件(当然,假设文件位于指定目录中),这将在下一个屏幕快照中演示。

cassandraEnhancedMoviesTableCreated

这里值得强调的一件事是,由cqlsh describe命令将创建为varchar 数据类型的列描述为text数据类型。 尽管我直接通过cqlsh创建了该表,但我也可以用Java创建该表,如下面的代码清单和代码清单cqlsh相关屏幕快照所示。

使用Java驱动程序创建Cassandra表

final String createMovieCql ="CREATE TABLE movies_keyspace.movies (title varchar, year int, description varchar, "+ "mmpa_rating varchar, dustin_rating varchar, PRIMARY KEY (title, year))";
client.getSession().execute(createMovieCql);

上面的代码访问实例变量client 。 接下来显示的是带有此实例变量的类。

MoviePersistence.java的外壳

package dustin.examples.cassandra;import com.datastax.driver.core.ResultSet;
import com.datastax.driver.core.Row;import java.util.Optional;import static java.lang.System.out;/*** Handles movie persistence access.*/
public class MoviePersistence
{private final CassandraConnector client = new CassandraConnector();public MoviePersistence(final String newHost, final int newPort){out.println("Connecting to IP Address " + newHost + ":" + newPort + "...");client.connect(newHost, newPort);}/*** Close my underlying Cassandra connection.*/private void close(){client.close();}
}

使用如上所述创建的MOVIES表(通过cqlsh或Java客户端代码创建),接下来的步骤是处理与该表相关的数据。 下一个代码清单显示了一种可用于将新行写入MOVIES表的方法。

/*** Persist provided movie information.** @param title Title of movie to be persisted.* @param year Year of movie to be persisted.* @param description Description of movie to be persisted.* @param mmpaRating MMPA rating.* @param dustinRating Dustin's rating.*/
public void persistMovie(final String title, final int year, final String description,final String mmpaRating, final String dustinRating)
{client.getSession().execute("INSERT INTO movies_keyspace.movies (title, year, description, mmpa_rating, dustin_rating) VALUES (?, ?, ?, ?, ?)",title, year, description, mmpaRating, dustinRating);
}

将数据插入MOVIES表后,我们需要能够对其进行查询。 下一个代码清单显示了按标题和年份查询电影的一种潜在实现。

使用Cassandra Java驱动程序查询

/*** Returns movie matching provided title and year.** @param title Title of desired movie.* @param year Year of desired movie.* @return Desired movie if match is found; Optional.empty() if no match is found.*/
public Optional<Movie> queryMovieByTitleAndYear(final String title, final int year)
{final ResultSet movieResults = client.getSession().execute("SELECT * from movies_keyspace.movies WHERE title = ? AND year = ?", title, year);final Row movieRow = movieResults.one();final Optional<Movie> movie =movieRow != null? Optional.of(new Movie(movieRow.getString("title"),movieRow.getInt("year"),movieRow.getString("description"),movieRow.getString("mmpa_rating"),movieRow.getString("dustin_rating"))): Optional.empty();return movie;
}

如果我们需要删除已经存储在Cassandra数据库中的数据,这很容易实现,如下面的代码清单所示。

使用Cassandra Java驱动程序删除

/*** Deletes the movie with the provided title and release year.** @param title Title of movie to be deleted.* @param year Year of release of movie to be deleted.*/
public void deleteMovieWithTitleAndYear(final String title, final int year)
{final String deleteString = "DELETE FROM movies_keyspace.movies WHERE title = ? and year = ?";client.getSession().execute(deleteString, title, year);
}

如本博文中的示例所示,使用Java驱动程序可以很容易地从Java应用程序访问Cassandra。 值得注意的是,Cassandra是用Java编写的 。 对于Java开发人员来说,这样做的好处是,许多Cassandra的配置值都是Java开发人员已经熟悉的JVM选项。 通过Cassandra conf目录中的cassandra-env.sh文件,可以指定Cassandra使用的标准JVM选项 (例如堆大小参数-Xms-Xmx-Xmn ), HotSpot特定的JVM选项 (例如-XX:-HeapDumpOnOutOfMemoryError-XX:HeapDumpPath , 垃圾收集调整选项和垃圾收集日志记录选项 ), 启用断言 ( -ea )以及将Cassandra公开以进行远程JMX管理 。

说到Cassandra和JMX,可以通过JMX 监视Cassandra ,如监视Cassandra群集的“使用JConsole监视”部分中所述 。 摘录 的《监控Cassandra的基础知识》还讨论了使用JMX监控Cassandra。 由于Java开发人员更可能熟悉JMX客户端(如JConsole和VisualVM) ,因此这是一种监视Java开发人员Cassandra的直观方法。

Cassandra的Java根的另一个优点是,可以扩展Cassandra使用的Java类,并且可以通过Java自定义Cassandra。 例如,可以通过扩展AbstractType类来实现自定义数据类型 。

结论

Cassandra Java驱动程序使从Java应用程序访问Cassandra变得容易。 Cassandra还具有基于Java的重要配置和监视功能,甚至可以使用Java进行自定义。

翻译自: https://www.javacodegeeks.com/2014/05/connecting-to-cassandra-from-java.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/363691.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Django---Model操作

一、字段 1 AutoField(Field)2 - int自增列&#xff0c;必须填入参数 primary_keyTrue3 4 BigAutoField(AutoField)5 - bigint自增列&#xff0c;必须填入参数 primary_keyTrue6 7 注&#xff1a;当model中如果没有自增列&#xff0c;则自动会创建…

Vuex的第一次接触

前言&#xff1a;最近在做Vue实现去哪网&#xff0c;想要实现在城市列表页面&#xff0c;点击某个城市的时候&#xff0c;主页的头部的城市会随着改变&#xff0c;就是首页和城市页面有共用的数据要分享&#xff0c;这里使用Vuex 1. Vuex是什么&#xff1f; 是Vue官方推荐的数…

java IO流小结

Java流操作有关的类或接口&#xff1a; Java流类图结构&#xff1a; 流的概念和作用 流是一组有顺序的&#xff0c;有起点和终点的字节集合&#xff0c;是对数据传输的总称或抽象。即数据在两设备间的传输称为流&#xff0c;流的本质是数据传输&#xff0c;根据数据传输特性将流…

华为android是什么型号,华为手机机型众多,目前这几款最值得入手

华为手机机型众多&#xff0c;目前这几款最值得入手2020-09-22 15:00:033点赞0收藏0评论华为手机可以说是国家手机的代名词。受某种感情的影响&#xff0c;很多人都用华为取代了iPhone。为了表达感情&#xff0c;很多人也纷纷效仿&#xff0c;购买华为手机。但我想说的是支持华…

pt-online-schema-change VS oak-online-alter-table【转】

前言 在上篇文章中提到了MySQL 5.6 Online DDL&#xff0c;如果是MySQL 5.5的版本在DDL方面是要付出代价的&#xff0c;虽然已经有了Fast index Creation&#xff0c;但是在添加字段还是会锁表的&#xff0c;而且在添加删除辅助索引是会加S锁&#xff0c;也就是无法进行写操作。…

vue命令行错误处理

全局安装vue/cli时&#xff1a;npm install -g vue/cli &#xff08;1&#xff09;Error: EACCES: permission denied, access /usr/local/lib/node_modules/vue/cli 原因: 执行命令时没有获得管理员权限 解决办法: 在命令前面加上sudo即可.然后输入电脑的管理员密码操作即可…

RAC(ReactiveCocoa)介绍(一)

最近在学习RAC&#xff0c;之前在iOS工作中&#xff0c;类之间的传值&#xff0c;无非是block、delegate代理、KVO和Notification等这几种方法。在RAC中&#xff0c;同样具备替代block、delegate代理、KVO和Notification&#xff0c;UI target、定时器timer、数据结构等各种方式…

一段简单的html 5 音频,5个用于处理HTML5音频的库和API

在过去的几个月中&#xff0c;我遇到了许多不同的库&#xff0c;它们利用了相对较新的HTML5 Audio API以及更著名的HTML5 Audio Element及其更简单的API。我以为我会在本文中分享这些库中的一小部分&#xff0c;以向您展示如果选择创建需要操纵声音文件的游戏或应用程序&#x…

WinAPI: SetRect 及初始化矩形的几种办法

本例分别用五种办法初始化了同样的一个矩形, 运行效果图:unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;typeTForm1 class(TForm)Button1: TButton;Button2: TButton;Button3: TButton;Button4: TBu…

备忘录——通过RVA计算文件位置

备忘录——通过RVA计算文件位置 原创&#xff1a;Anders Liu 摘要&#xff1a;本文介绍了如何通过PE文件中某一项的RVA来计算其在文件中的位置。 参考文献 ECMA-335——Common Language Infrastructure (CLI) 4th Edition, June 2006 范畴 该备忘录描述了在分析PE&#xff08;可…

中后端管理系统前后分离、前端框架的实现拙见

一、实现思路 在实践中后台管理系统的前后端分离时&#xff0c;往往会因为业务量的增加使其前端项目难以维护&#xff0c;以及打包时间不理想&#xff0c;还有业务系统与框架之间区分不在明显。本文是本人从另一个角度提出的一种解决方案&#xff0c;希望各位提出宝贵的建议。…

初见mobX

先看如下的代码 const {observable} mobox; const {observer}mobxReact; const {Component}React; const appStateobservable({count:0 }) appState.incrementfunction(){this.count } appState.decrementfunction(){this.count-- } observer class Counter extends Component{…

【留言板】可编辑输入框操作总结

闲暇之余&#xff0c;用于加深自己对基础的了解&#xff0c;徒手撸了一个留言板&#xff1a;输入框。废话少说&#xff0c;进入正题。简陋的效果如下(下载代码)&#xff1a; 一、定义需求 可输入文本&#xff0c;以及插入表情。兼容性&#xff1a;IE与标准浏览器 二、详细设计…

2021年兰州师大附中高考成绩查询,2021年兰州重点高中名单及排名,兰州高中高考成绩排名榜...

”一千个人眼中&#xff0c;就有一千个哈姆雷特“。关于兰州高职学校排名&#xff0c;每个人的观点也是各不相同&#xff0c;今天就给大家分享一下我心中的兰州高中排名及格局分布&#xff0c;主要参考依据是近年中考录取分数线及高考成绩。数据仅供参考&#xff01;希望对你有…

use vue vuex vue-router, not use webpack

vue,vuex,vue-router放在一起能做什么&#xff1f;不用webpack之类的打包工具使用他们是否可行&#xff1f;各位道友在初学vue时是否有这样的困惑。因为现代构建前端项目的一般模式是&#xff1a; 安装webapck&#xff0c;某种是glup,grunt&#xff0c;或者是fis等构建工具然后…

SQL重复记录查询(转载)

1、查找表中多余的重复记录&#xff0c;重复记录是根据单个字段&#xff08;peopleId&#xff09;来判断select * from peoplewhere peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1) 例二&#xff1a;select * from testt…

ubuntu16 升级pip3后报错File /usr/bin/pip3, line 9, in module from pip import main ImportError: cannot...

问题&#xff1a;ubuntu16 执行pip3 install --upgrade pip之后&#xff0c;pip3执行出错。 Traceback (most recent call last): File "/usr/bin/pip3", line 9, in <module> from pip import mainImportError: cannot import name main 截图如下&#xff1a;…

HTTP 简介

1、HTTP 简介 HTTP协议&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;&#xff0c;是用于从WWW万维网服务器传输超文本到本地浏览器的传送协议。 HTTP基于TCP/IP通信协议来传递数据&#xff08;HTML 文件, 图片文件, 查询结果等&#xff09…

计算机博士英语复试题目,博士复试自我介绍中英文双语解读

博士复试自我介绍中英文双语解读关于博士复试自我介绍中英文篇一(中文篇)尊敬的老师,晚上好!我很高兴能来这里参加面试。现在让我给一个简短的自我介绍。我是* * *,出生在* *。我是一个老师的信息科学与工程学院,山东科技大学。我在1997年进入这所大学,主修计算机科学与技术。2…

如何在J2ME中创建MIDlet

总览 Java移动应用程序称为J2ME。 通常&#xff0c;当我们在移动技术领域工作时&#xff0c;我们必须考虑J2ME应用程序。 通过这种方式&#xff0c;我们可以开发我们的移动应用程序&#xff0c;也可以通过jad或jar文件将其安装在我们的设备中。 近年来&#xff0c;手机开发中最…