在使用DataStax的Cannsandra的Java驱动程序连接到Cassandra客户端时,它会抛出以下错误.
线程"main"中的异常com.datastax.driver.core.exceptions.NoHostAvailableException:尝试查询的所有主机都失败(尝试:[/ 127.0.0.1])
请建议......
谢谢!
我的java代码是这样的:
package com.example.cassandra;
import com.datastax.driver.core.Cluster;
import com.datastax.driver.core.Host;
import com.datastax.driver.core.Metadata;
public class SimpleClient {
private Cluster cluster;
public void connect(String node){
cluster = Cluster.builder().addContactPoint(node).build();
Metadata metadata = cluster.getMetadata();
System.out.println(metadata.getClusterName());
}
public void close()
{
cluster.shutdown();
}
public static void main(String args[]) {
SimpleClient client = new SimpleClient();
client.connect("127.0.0.1");
client.close();
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试运行以下查询
SELECT edge_id, b_id FROM booking_by_edge WHERE edge_id IN ?
Run Code Online (Sandbox Code Playgroud)
我绑定了Long的Java列表作为参数,我得到一个例外
SyntaxError: line 0:-1 mismatched input '<EOF>' expecting ')' (ResultSetFuture.java:242)
Run Code Online (Sandbox Code Playgroud)
如果我尝试使用(?)它需要绑定单个Long项,但我需要一个集合
我的语法有错误吗?
我使用datastax作为连接cassandra的客户端.我已经通过Java成功连接到cassandra集群/密钥空间/列系列.我正在尝试,对cassandra专栏家族thriugh java发出一些疑问.对我来说,它适用于简单的查询
ResultSet results = session.execute("select * from demodb.customer where id = 1");
Run Code Online (Sandbox Code Playgroud)
现在我想从用户获取id参数并将其传递给session.execute(); 声明.我该怎么办呢?
com.datastax.driver.core.PreparedStatement实例应该是应用程序中的单例吗?
如果是这样,如果连接丢失会发生什么?PreparedStatement是否无效并且必须采取手动操作来"重新制定"?
PreparedStatement用法的一个简单例子(除了准备+在同一方法中执行)将是辉煌的!
prepared-statement cassandra datastax-enterprise datastax-java-driver
如果使用纯文本CQL,DataStax Java Driver是否容易受到CQL注入攻击?会使用QueryBuilder帮助吗?
我只是将这个作为解决方案发布给那些在Glassfish 4上通过Maven部署使用Datastax的Java驱动程序时遇到错误的人.
正如在Datastax的网站上写的那样,驱动程序的依赖性是:
<dependency>
<groupId>com.datastax.cassandra</groupId>
<artifactId>cassandra-driver-core</artifactId>
<version>1.0.1</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
不幸的是,如果你通过Maven将它部署到Glassfish 4,它会抛出org.glassfish.deployment.common.DeploymentException:CDI部署失败......就像下面这样:
org.glassfish.deployment.common.DeploymentException: CDI deployment failure:WELD-001408 Unsatisfied dependencies for type [Set<Service>] with qualifiers [@Default] at injection point [[BackedAnnotatedParameter] Parameter 1 of [BackedAnnotatedConstructor] @Inject com.google.common.util.concurrent.ServiceManager(Set<Service>)]
at org.glassfish.weld.WeldDeployer.event(WeldDeployer.java:225)
at org.glassfish.kernel.event.EventsImpl.send(EventsImpl.java:131)
at org.glassfish.internal.data.ApplicationInfo.load(ApplicationInfo.java:328)
at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:493)
at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:219)
at org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:491)
at com.sun.enterprise.v3.admin.CommandRunnerImpl$2$1.run(CommandRunnerImpl.java:527)
at com.sun.enterprise.v3.admin.CommandRunnerImpl$2$1.run(CommandRunnerImpl.java:523)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:356)
at com.sun.enterprise.v3.admin.CommandRunnerImpl$2.execute(CommandRunnerImpl.java:522)
at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:546)
at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1423)
at com.sun.enterprise.v3.admin.CommandRunnerImpl.access$1500(CommandRunnerImpl.java:108)
at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1762)
at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1674)
at com.sun.enterprise.v3.admin.AdminAdapter.doCommand(AdminAdapter.java:534)
at com.sun.enterprise.v3.admin.AdminAdapter.onMissingResource(AdminAdapter.java:224)
at org.glassfish.grizzly.http.server.StaticHttpHandler.service(StaticHttpHandler.java:297)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:246)
at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:191)
at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:168)
at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:189)
at …Run Code Online (Sandbox Code Playgroud) cassandra maven datastax-enterprise glassfish-4 datastax-java-driver
当我们创建PreparedStatement对象时,它是否缓存在服务器端?与Oracle驱动程序中的PreparedStatement相比有何不同?如果重用了准备好的语句,那么将什么数据发送到Cassandra服务器,只有param值?
据我所知,java驱动程序中的一个Session对象拥有多个与集群中多个节点的连接.如果我们在多个线程中的应用程序中重用相同的预处理语句,是否会使我们只使用一个连接到一个Cassandra?我猜准备语句仅在一个连接上完成...当每个执行调用更新路由键时会发生什么?
使用准备好的陈述有什么好处?
谢谢
在尝试连接到群集时,如何告诉Datastax Java Cassandra驱动程序超时?
我对主机可以访问的情况特别感兴趣,但是Cassandra端口被阻塞或者Cassandra守护进程没有运行.我正在编写一个命令行客户端,如果它无法在合理的时间内连接,它应该退出并报告合适的错误消息.目前,如果联系点可以到达,驱动程序似乎将永远等待接触点响应.
也就是说,如果驱动程序无法在给定的最大时间内与任何接触点的Cassandra守护程序通信,我想Cluster.build()抛出一个NoHostAvailableException.
RetryPolicy不起作用:那是为了重试查询,我希望在我们准备好运行查询之前应用超时.ReconnectinoPolicy最初看起来很有希望,但是接口的合同没有提供任何指示"认为这个节点永远死了"的方法我知道我们可以用这样的东西向Cassandra插入单个记录(下面的例子取自这里):
final String INSERT_STATEMENT = "INSERT INTO employees (empID, deptID, first_name, last_name) VALUES (?, ?, ?, ?);";
result = keyspace
.prepareQuery(CQL3_CF)
.withCql(INSERT_STATEMENT)
.asPreparedStatement()
.withIntegerValue(222)
.withIntegerValue(333)
.withStringValue("Eric")
.withStringValue("Cartman")
.execute();
Run Code Online (Sandbox Code Playgroud)
是否可以使用Astyanax的cql3 API(如JDBC的executeBatch)进行批量插入(用于多个记录)?
注意:使用Astyanax的MutationBatch(基于Thrift,而不是CQL)对我来说似乎不是一个选择,因为我遇到了与此问题相同的问题.