在我的帖子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<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