在我的帖子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中执行以上文件(当然,假设文件位于指定目录中),这将在下一个屏幕快照中演示。
这里值得强调的一件事是,由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 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 =
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