从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中执行以上文件(当然,假设文件位于指定目录中),这将在下一个屏幕快照中演示。

从Java连接到Cassandra_第1张图片

这里值得强调的一件事是,由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

你可能感兴趣的:(数据库,java,mysql,jdbc,mongodb)