标签: datastax-java-driver

Datastax PreparedStatements的工作原理

当我们创建PreparedStatement对象时,它是否缓存在服务器端?与Oracle驱动程序中的PreparedStatement相比有何不同?如果重用了准备好的语句,那么将什么数据发送到Cassandra服务器,只有param值?

据我所知,java驱动程序中的一个Session对象拥有多个与集群中多个节点的连接.如果我们在多个线程中的应用程序中重用相同的预处理语句,是否会使我们只使用一个连接到一个Cassandra?我猜准备语句仅在一个连接上完成...当每个执行调用更新路由键时会发生什么?

使用准备好的陈述有什么好处?

谢谢

prepared-statement cassandra datastax-java-driver

6
推荐指数
1
解决办法
878
查看次数

使用DataStax驱动程序的Cassandra行级锁定支持

当前用户访问同一行时,Cassandra行级锁定支持

考虑到Cassandra作为库存数据库,我们处于推车应用的设计阶段.现在的要求是,如果多个用户同时访问Inventory DB中的相同产品行.例如: - 产品表:productID productQuantitiy 1000 1如果第一个用户选择产品"1000"并在购物车中添加产品数量为"1",访问同一产品的其他用户在获得免费之前不应该选择此产品第一个用户(更新的产品数量为0).cassandra也为这种场景提供了行级锁定支持

cassandra datastax-java-driver

6
推荐指数
1
解决办法
7417
查看次数

使用Cassandra和CQL3,如何在单个请求中插入整个宽行?

我想在Cassandra 1.2.8中插入一行包含50,000列的单行.在插入之前,我已准备好整个行的所有数据(在内存中):

+---------+------+------+------+------+-------+
|         | 0    | 1    | 2    | ...  | 49999 |
| row_id  +------+------+------+------+-------+
|         | text | text | text | ...  | text  |
+---------+------+------+------|------+-------+
Run Code Online (Sandbox Code Playgroud)

列名是整数,允许切片进行分页.列值是该特定索引处的值.

CQL3表定义:

create table results (
    row_id text,
    index int,
    value text,
    primary key (row_id, index)
) 
with compact storage;
Run Code Online (Sandbox Code Playgroud)

由于我已经在内存中拥有row_id和所有50,000个名称/值对,我只想在单个请求/操作中向Cassandra中插入一行,以便尽可能快.

我似乎唯一能找到的是执行以下50,000次:

INSERT INTO results (row_id, index, value) values (my_row_id, ?, ?);
Run Code Online (Sandbox Code Playgroud)

第一个?是索引计数器(i),第二个?是要存储在位置的文本值i.

这需要很多时间.即使我们将上述INSERT放入批处理中,也需要花费很多时间.

我们完整地拥有了我们需要的所有数据(完整的行),我认为很容易说"这里,Cassandra,将这些数据作为一行存储在一个请求中",例如:

//EXAMPLE-BUT-INVALID CQL3 SYNTAX:
insert into results …
Run Code Online (Sandbox Code Playgroud)

cassandra cql3 datastax-java-driver

6
推荐指数
1
解决办法
5774
查看次数

Cassandra NoHostAvailableException,但仍有活动节点

我在一个DC中有两个C*2.0.2节点(在cassandra.yaml中有默认配置)和一个RF = 2的密钥空间.两个客户端使用Datastax Java Driver 1.0.3连接到此DC.客户端使用CL = ONE从/向C*读取和写入数据,没有任何错误.但当我关闭一个节点时,两个客户端都会遇到大量异常:

com.datastax.driver.core.exceptions.NoHostAvailableException:
All host(s) tried for query failed (no host was tried)
Run Code Online (Sandbox Code Playgroud)

在那一堆例外之后,客户端继续成功地与另一个仍然存活的节点一起工作.我应该怎么做才能收到任何NoHostAvailableException,因为一次至少有一个活动节点并且使用了CL = ONE?

更新: 当我关闭两个节点中的一个时,我有时会在我的应用程序日志中看到以下异常:

[Reconnection-1] [ERROR] [Control connection] Cannot connect to
any host, scheduling retry
Run Code Online (Sandbox Code Playgroud)

如果我只关闭一个节点,为什么两个节点都不可用?第二个还活着,我可以用cqlsh连接到它.

java cassandra datastax-java-driver

6
推荐指数
1
解决办法
3652
查看次数

卡桑德拉的原子批次

批量陈述是什么意思在cassandra中是原子的?文件在性质上有点令人困惑,准确无误.这是否意味着查询在群集中的节点之间是原子的?

比方说,我有一个包含100个查询的批处理.如果批处理中的第40个查询失败,那么批处理中执行的39个查询会发生什么?

我知道在引擎盖下创建了一个批处理日志,它将处理部分批处理的一致性.它是否删除了39个条目中的其余条目并提供批处理查询所需的原子性质.

在MYSQL中,我们将autocommit设置为false,因此我们可以回滚.那些情况下cassandra会回滚吗?

batch-processing cassandra datastax-java-driver cassandra-2.0

6
推荐指数
1
解决办法
5604
查看次数

Cassandra读取超时

我从cassandra 2.0中提取了大量数据,但遗憾的是获得了超时异常.我的桌子:

CREATE KEYSPACE StatisticsKeyspace
  WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 3 };


CREATE TABLE StatisticsKeyspace.HourlyStatistics(
KeywordId text,
Date timestamp,
HourOfDay int,
Impressions int,
Clicks int,
AveragePosition double,
ConversionRate double,
AOV double,
AverageCPC double,
Cost double,
Bid double,
PRIMARY KEY(KeywordId, Date, HourOfDay)
);
CREATE INDEX ON StatisticsKeyspace.HourlyStatistics(Date);
Run Code Online (Sandbox Code Playgroud)

我的查询:

SELECT KeywordId, Date, HourOfDay, Impressions, Clicks,AveragePosition,ConversionRate,AOV,AverageCPC,Bid 
FROM StatisticsKeyspace.hourlystatistics 
WHERE Date >= '2014-03-22' AND Date <= '2014-03-24'
Run Code Online (Sandbox Code Playgroud)

我在我的cassandra.yaml文件中更改了配置.

read_request_timeout_in_ms: 60000
range_request_timeout_in_ms: 60000
write_request_timeout_in_ms: 40000
cas_contention_timeout_in_ms: 3000
truncate_request_timeout_in_ms: 60000 …
Run Code Online (Sandbox Code Playgroud)

cassandra cassandra-cli datastax-java-driver datastax cassandra-2.0

6
推荐指数
1
解决办法
2万
查看次数

为Cassandra Writes获得背压的最佳方法是什么?

我有一项服务,该服务以我控制的速率消耗队列外的消息。我进行了一些处理,然后尝试通过Datastax Java客户端写入Cassandra集群。我已经使用maxRequestsPerConnection和设置了我的Cassandra集群maxConnectionsPerHost。但是,在测试中,我发现当我到达maxConnectionsPerHostmaxRequestsPerConnection致电到session.executeAsync不会阻塞。

我现在正在做的是使用a new Semaphore(maxConnectionsPerHost * maxRequestsPerConnection),并在每个异步请求之前将其递增,并在将来返回的executeAsync结束时递减。这足够好,但是由于驱动程序已经在内部跟踪请求和连接,因此显得多余。

有没有人为这个问题提出更好的解决方案?

一个警告:我希望在请求完成之前将其视为未完成的请求。这包括重试!我从群集中获取重试失败的情况(例如等待一致性的超时)是主要的情况,我想对此施加压力并停止使用队列中的消息。

问题:

// the rate at which I consume messages depends on how fast this method returns
processMessage(message) {
    // this appears to return immediately even if I have exhausted connections/requests
    session.executeAsync(preparedStatement.bind(...));
}
Run Code Online (Sandbox Code Playgroud)

当前解决方案:

constructor() {
    this.concurrentRequestsSemaphore = new Semaphore(maxConnectionsPerHost * maxRequestsPerConnection);
}

processMessage(message) {
    ResultSetFuture resultSetFuture = session.executeAsync(preparedStatement.bind(...));
    CompletableFuture<ResultSet> future = completableFromListenable(resultSetFuture);
    concurrentRequestsSemaphore.acquireUninterruptibly();
    future.whenComplete((result, exception) -> …
Run Code Online (Sandbox Code Playgroud)

java cassandra backpressure datastax-java-driver

6
推荐指数
1
解决办法
2223
查看次数

有没有一种优雅的方式通过CQL(Cassandra)执行JSON更新?

我(理想情况下)喜欢使用纯JSON更新Cassandra中的一行(例如,类似于" INSERT INTO <table_name> JSON '<json_object_string>';"CQL语句).但是,通过CQL UPDATE语句似乎不存在此类功能.

我考虑的一种(脑死亡)方法是删除然后重新插入相关行.然而,这种方法肯定有其缺点 - 因此,从我的考虑集中消除它.

我使用" UPDATE <table_name> SET <key1> = '<new_value1>', <key2> = '<new_value2>', ..., <keyN> = '<new_valueN>';"CQL语句实现了一个版本.但是,如果有类似" UPDATE <table_name> JSON '<new_json_object_string>';"的东西,我真的很想知道这一点.

json cassandra datastax-java-driver datastax

6
推荐指数
2
解决办法
2732
查看次数

将DNS故障转移用作多DC故障转移策略吗?

如果我有一个多DC集群,DC1DC2,其中DC2仅用于故障转移.在客户端的驱动程序中,我使用域名定义联系点(foo1.net, foo2.net, and foo3.net).我有foo*指向DC1,如果我检测到任何DC1错误,我将使DNS路由foo*指向DC2.

这种方法似乎在纸上工作,但它实际上会起作用吗?这种方法有什么问题吗?

cassandra datastax-enterprise datastax-java-driver

6
推荐指数
1
解决办法
91
查看次数

DataStax Cassandra核心驱动器依赖于易受攻击的Guava-19

DataStax cassandra核心 Java驱动器对guava-19(包括最新的DataStax)具有传递性依赖关系,而guava-19具有安全漏洞(CVE-2018-10237)。

为了解决这个问题,当我尝试从DataStax驱动器中排除guava-19.0依赖项并替换为guava-27.1-jre时,在运行时出现以下错误,并通过反编译最新的guava驱动程序进行了确认;好像从guava-20.0中删除了FutureFallback类,并且与最新的cassandra驱动器没有向后兼容性。

java.lang.NoClassDefFoundError: com/google/common/util/concurrent/FutureFallback
Run Code Online (Sandbox Code Playgroud)

任何帮助或快速修复或替代都是非常可取的。

security cassandra datastax-enterprise datastax-java-driver datastax

6
推荐指数
1
解决办法
248
查看次数