要求
要遵循本教程,您应该已经有一个正在运行的Cassandra实例( 一个小型集群会很好 ,但不是必需的),已安装Datastax Java驱动程序( 请参阅第I部分 ),并且已经在这里进行了10分钟的演练: http ://planetcassandra.org/create-a-keyspace-and-table/ 。
试试看
对于本演示,我们将创建一个简单的控制台应用程序,该应用程序几乎与第I部分中的应用程序相同,只是这次我们将探索连接策略,准备好的语句和查询生成器。 打开文本编辑器,并使用“ GettingStartedTwo”类和单个main方法创建一个Java文件。
public class GettingStartedTwo {public static void main(String[] args) {Cluster cluster;Session session;ResultSet results;Row rows;
然后,我们可以连接到集群并创建一个会话实例。
// Connect to the cluster and keyspace "demo"
Cluster cluster = Cluster.builder().addContactPoint("localhost").build();
Session session = cluster.connect("demo");
但是,等等,既然我们正在运行一个群集而不是一个实例,那么在故障转移的情况下,我们需要采取一些保护措施。 我们可以使用RetryPolicy来做到这一点。retry策略确定当请求超时或节点不可用时要采用的默认行为。 在这种情况下,我们使用DefaultRetryPolicy,它将重试查询之一:
- 读取超时时,已回复足够多的副本但未接收到数据。
- 在写超时时,如果我们在写批处理语句使用的日志时超时。
cluster = Cluster.builder().addContactPoint("192.168.0.30").withRetryPolicy(DefaultRetryPolicy.INSTANCE).build();
session = cluster.connect("demo");
负载平衡策略将确定要在哪个节点上运行查询。 由于客户端可以读取或写入任何节点,因此有时效率低下。 如果一个节点收到另一个节点拥有的读取或写入,它将为客户端协调该请求。 我们可以使用负载平衡策略来控制该操作。 TokenAwarePolicy确保请求将转到负责主键指示的数据的节点或副本。 它包装在DCAwareRoundRobinPolicy周围,以确保请求保留在本地数据中心中。 这对我们来说是一个不错的选择,因为尽管目前我们只有一个本地集群,但我们已经在考虑下一步,将其扩展到多数据中心。
cluster = Cluster.builder().addContactPoint("192.168.0.30").withRetryPolicy(DefaultRetryPolicy.INSTANCE).withLoadBalancingPolicy(new TokenAwarePolicy(new DCAwareRoundRobinPolicy())).build();
session = cluster.connect("demo");
现在您已连接到“演示”键空间,现在将用户插入“用户”表中。 这正是我们之前在第一部分中所做的,但是这次我们的做法有所不同。 使用准备好的语句更加安全,这是将数据移入或移出数据库的最有效方式。 集群只需要对准备好的语句进行一次解析,然后将值绑定到变量,然后我们执行绑定的语句以从集群读取/写入数据。
// Insert one record into the users tablePreparedStatement statement = session.prepare("INSERT INTO users" + "(lastname, age, city, email, firstname)"+ "VALUES (?,?,?,?,?);");BoundStatement boundStatement = new BoundStatement(statement);session.execute(boundStatement.bind("Jones", 35, "Austin","bob@example.com", "Bob"));
使用Java驱动程序,我们可以轻松地撤消用户。 在Java的Apache Cassandra入门入门的第一部分中,我们使用了CQL的字符串表示形式。 现在(以及本教程的其余部分),我们将使用Query Builder进行相同的操作,它更加安全,并且可以避免潜在的CQL注入攻击。
// Use select to get the user we just enteredStatement select = QueryBuilder.select().all().from("demo", "users").where(eq("lastname", "Jones"));results = session.execute(select);for (Row row : results) {System.out.format("%s %d \n", row.getString("firstname"),row.getInt("age"));}
由于是鲍勃(Bob)的生日,我们将更新他的年龄。
// Update the same user with a new ageStatement update = QueryBuilder.update("demo", "users").with(QueryBuilder.set("age", 36)).where((QueryBuilder.eq("lastname", "Jones")));session.execute(update);
// Select and show the changeselect = QueryBuilder.select().all().from("demo", "users").where(eq("lastname", "Jones"));results = session.execute(select);for (Row row : results) {System.out.format("%s %d \n", row.getString("firstname"),row.getInt("age"));
现在,让我们从表中删除Bob,并打印出剩余在users表中的所有信息。 您会注意到,鲍勃的信息在删除后不再返回(如果您以前插入过用户,则其他人可能会回来)。
// Delete the user from the users tableStatement delete = QueryBuilder.delete().from("users").where(QueryBuilder.eq("lastname", "Jones"));results = session.execute(delete);// Show that the user is goneselect = QueryBuilder.select().all().from("demo", "users");results = session.execute(select);for (Row row : results) {System.out.format("%s %d %s %s %s\n", row.getString("lastname"),row.getInt("age"), row.getString("city"),row.getString("email"), row.getString("firstname"));}
完成后,请确保连接关闭。
// Clean up the connection by closing it
cluster.close();}
}
CQL与SQL非常相似,在许多情况下,相同的语法将起作用。 如果您具有关系数据库的背景知识,这使得查询数据非常简单。您刚刚设法连接到Cassandra集群并针对实时(本地)数据库执行查询。 希望这证明了使用Java驱动程序使用Cassandra多么容易。 GitHub上提供了此示例的完整控制台应用程序的要点。
翻译自: https://www.javacodegeeks.com/2014/12/getting-started-with-apache-cassandra-and-java-part-ii.html