从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中執行以上文件(當然,假設文件位于指定目錄中),這將在下一個屏幕快照中演示。
這里值得強調的一件事是,由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
總結
以上是生活随笔為你收集整理的从Java连接到Cassandra的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java的编年史和低延迟
- 下一篇: 证券备案登记的机构(证券备案)