从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;则自动会创建…

8. Action过滤

Action过滤原文: http://quickstarts.asp.net/3-5-extensions/mvc/ActionFiltering.aspx1. 介绍一般Action与用户动作是一对一的关系,用户的某一个动作对应一个特定的Action.然而,有时你可能会希望在Action执行的前后执行指定的操作,MVC中可以通过Action过滤器来实现这个功能.A…

android运行时状态,Android 如何保存Android 运行时状态

Android 如何保存Android 运行时状态使用 SaveInstanceState去保存运行时数据首先&#xff0c;我们需要重写一下系统的public void onSaveInstanceState(Bundle savedInstanceState)方法并在onSaveInstanceState方法中添加需要保存的数据。最后我们可以在onRestoreInstanceStat…

程序文件分类及编写要求

一级&#xff1a;管理体系手册 由质量管理部负责编制&#xff0c;最高管理者批准后发布生效。举例如&#xff1a;XX公司管理手册 二级&#xff1a;管理体系程序文件 由各相关部门进行编写&#xff0c;质量管理部体系负责人审核通过各部门评审会签&#xff0c;由管理者代表批…

仿制药的美丽与陌生

最近&#xff0c;我正在为Oracle认证专家Java SE 7程序员考试做准备&#xff0c;而我恰巧在Java泛型领域遇到了一些看起来很奇怪的结构。 但是&#xff0c;我也看到了一些巧妙而优雅的代码。 我发现这些示例值得分享&#xff0c;这不仅是因为它们可以使您的设计选择更容易&…

C# 判断txt文件编码格式

/// <summary> /// 获取文件的编码格式 /// </summary> public class EncodingType{/// <summary> /// 给定文件的路径&#xff0c;读取文件的二进制数据&#xff0c;判断文件的编码类型 /// </summary> /// <param name“FILE_NAME“>文件路径&…

Vuex的第一次接触

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

乐刻运动 app android,乐刻运动

乐刻运动是一款广受欢迎的运动健身软件&#xff0c;不论你是想打造完美身材还是减脂减重&#xff0c;乐刻运动都会为你制定严格而又科学的运动健身计划&#xff0c;相当于一个掌上私人的健身教练&#xff0c;时刻关注你的健身状况&#xff0c;快来下载试试吧。乐刻运动软件优势…

新的公司:Dendrite

开始新的学习 好好学好技术&#xff0c;为了未来.ganjuebucuo 转载于:https://www.cnblogs.com/xinhua327/articles/1188299.html

RK3288 mipi屏调试流程

CPU&#xff1a;RK3288 系统&#xff1a;Android 5.1 1、修改kernel/arch/arm/configs/rockchip_defconfig&#xff0c;打开mipi屏开关 # CONFIG_LCD_GENERAL is not set CONFIG_LCD_MIPIy CONFIG_RK_TRSMy # CONFIG_RK32_LVDS is not set # CONFIG_RK32_DP is not set # CONFI…

java IO流小结

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

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

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

向Java添加@atomic操作

总览 原子操作如何在Java中工作&#xff0c;OpenJDK / Hotspot中是否存在可以转换为原子的当前替代方法。 反馈 在我以前的文章中&#xff0c; 对可变字段进行原子操作。 有人指出&#xff0c;无论好意如何&#xff0c;“修复”先前的行为都不太可能继续进行。 替代方法是添加…

JSP页面中使用超链接进行传输参数(参数是一个本地磁盘链接)问题

在使用COS组件进行文件上传下载时遇到一个下载问题 刚开始我存的地址格式为&#xff1a;D:\tool\upload发现一直报Error parsing HTTP request header Note: further occurrences of HTTP header p的错误 后来发现使用超链接传参数不支持“\”字符&#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;也就是无法进行写操作。…

The Pilots Brothers' refrigerator

#include<iostream> #include<cstdio> #include<string> using namespace std; int mem[4][4];//用于储存翻转次数&#xff0c;如果是偶数&#xff0c;则相当于没有翻转int main(){char ch;for (int x 0; x<4; x){//按sample的顺序,x代表纵行,y是横列for…

Jax-RS自定义异常处理

使用JEE的好处之一是可用的组件确实是非常标准的。 在使用JAX-RS时&#xff0c;有时您需要控制如何处理异常并将其反馈给用户。 默认情况下&#xff0c;如果引发异常&#xff0c;您将得到一些可怕的HTTP 500内部服务器异常&#xff0c;从而暴露Web服务的内部故障。 考虑以下要…

开张大吉!

新工作&#xff0c;新技术&#xff0c;新开始&#xff01; 开这个博客&#xff0c;希望能记录自己在新公司的点点滴滴&#xff01; 转载于:https://www.cnblogs.com/newman78/archive/2008/05/14/1197227.html

html中评论应该怎么写,HTML-评论

HTML-评论注释是一段代码&#xff0c;任何网络浏览器都将忽略它。最好在HTML代码中添加注释&#xff0c;尤其是在复杂的文档中&#xff0c;以指示文档的各个部分&#xff0c;以及任何其他注释代码的人。注释可帮助您和其他人理解您的代码并提高代码的可读性。HTML注释位于标记之…

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即可.然后输入电脑的管理员密码操作即可…