- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
阻止 com.datastax.driver.core.Session 执行方法
public ResultSet execute(Statement statement);
对此方法的评论:
This method blocks until at least some result has been received from the database. However, for SELECT queries, it does not guarantee that the result has been received in full. But it does guarantee that some response has been received from the database, and in particular guarantee that if the request is invalid, an exception will be thrown by this method.
来自 com.datastax.driver.core.Session 的非阻塞执行方法
public ResultSetFuture executeAsync(Statement statement);
This method does not block. It returns as soon as the query has been passed to the underlying network stack. In particular, returning from this method does not guarantee that the query is valid or has even been submitted to a live node. Any exception pertaining to the failure of the query will be thrown when accessing the {@link ResultSetFuture}.
我有 02 个关于它们的问题,因此如果您能帮助我理解它们,那就太好了。
假设我有 100 万条记录,我希望所有这些记录都到达数据库(没有任何丢失)。
问题 1:如果我有 n 个线程,则所有线程都将具有需要发送到数据库的相同数量的记录。它们都使用阻塞执行调用继续向 cassandra 发送多个插入查询。如果我增加 n 的值,是否也有助于加快我需要将所有记录插入到 cassandra 的时间?
这会导致 cassandra 的性能问题吗? Cassandra 是否必须确保对于每个插入记录,集群中的所有节点都应立即了解新记录?为了保持数据的一致性。 (我假设 cassandra 节点甚至不会考虑使用本地机器时间来控制记录插入时间)。
问题2:使用非阻塞执行,如何确保所有插入都成功?我知道的唯一方法是等待 ResultSetFuture 检查插入查询的执行情况。我还有什么更好的办法吗?非阻塞执行是否比阻塞执行更容易失败?
非常感谢您的帮助。
最佳答案
If I have n number of threads, all threads will have the same amount of records they need to send to the database. All of them continue sending multiple insert queries to cassandra using blocking execute call. If I increase the value of n, will it also helps to speed up the time that I need to insert all records to cassandra?
在某种程度上。让我们稍微分离一下客户端实现细节,并从“并发请求数”的角度来看问题,因为如果使用executeAsync,则不需要为每个正在进行的请求都有一个线程。在我的测试中,我发现虽然拥有大量并发请求有很多值(value),但存在一个阈值,达到该阈值就会出现 yield 递减或性能开始下降。我的一般经验法则是(number of Nodes *
native_transport_max_threads (default: 128)
* 2)
,但或多或少您可能会发现更优化的结果。
这里的想法是,排队的请求数量超过 cassandra 一次处理的数量并没有多大值(value)。在减少正在进行的请求数量的同时,您还可以限制驱动程序客户端和 cassandra 之间连接上不必要的拥塞。
Question 2: With non-blocking execute, how can I assure that all of the insertions is successful? The only way I know is waiting for the ResultSetFuture to check the execution of the insert query. Is there any better way I can do ? Is there a higher chance that non-blocking execute is easier to fail then blocking execute?
通过 get
等待 ResultSetFuture是一种途径,但如果您正在开发完全异步的应用程序,您希望尽可能避免阻塞。使用 Guava ,你最好的两个武器是 Futures.addCallback
和 Futures.transform
.
Futures.addCallback
允许您注册 FutureCallback
当驱动程序收到响应时执行。 onSuccess
在成功的情况下执行,onFailure
否则。
Futures.transform
允许您有效地映射返回的 ResultSetFuture
进入别的东西。例如,如果您只需要 1 列的值,您可以使用它来转换 ListenableFuture<ResultSet>
到 ListenableFuture<String>
无需在 ResultSetFuture
上阻止您的代码然后获取 String 值。
在编写数据加载程序时,您可以执行以下操作:
Semaphore
或具有固定数量许可的其他结构(这将是您的飞行请求的最大数量)。每当您使用 executeAsync
提交查询时,获得许可证。您实际上应该只需要 1 个线程(但可能需要引入一个 # cpu 核心大小的池来执行此操作)来从信号量获取许可并执行查询。它只会阻止获取,直到有可用的许可为止。Futures.addCallback
对于从 executeAsync
返回的 future 。回调应该调用 Sempahore.release()
两者皆 onSuccess
和onFailure
案例。通过释放许可证,这应该允许您在步骤 1 中的线程继续并提交下一个请求。要进一步提高吞吐量,您可能需要考虑使用 BatchStatement
并批量提交请求。如果您保持较小的批处理(50-250 是一个不错的数字)并且批处理中的插入全部共享相同的分区键,那么这是一个不错的选择。
关于cassandra - Cassandra 如何处理 datastax java 驱动程序中的阻塞执行语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34949292/
我有一个“有趣”的问题,即以两种不同的方式运行 wine 会导致: $> wine --version /Applications/Wine.app/Contents/Resources/bin/wi
我制作了这个网络抓取工具来获取网页中的表格。我使用 puppeteer (不知道 crontab 有问题)、Python 进行清理并处理数据库的输出 但令我惊讶的是,当我执行它时 */50 * * *
JavaScript 是否被调用或执行取决于什么?准确地说,我有两个函数,它们都以相同的方式调用: [self.mapView stringByEvaluatingJavaScriptFromStri
我目前正在使用 python 做一个机器学习项目(这里是初学者,从头开始学习一切)。 只是想知道 statsmodels 的 OLS 和 scikit 的 PooledOlS 使用我拥有的相同面板数据
在使用集成对象模型 (IOM) 后,我可以执行 SAS 代码并将 SAS 数据集读入 .Net/C# 数据集 here . 只是好奇,使用 .Net 作为 SAS 服务器的客户端与使用 Enterpr
有一些直接的 jQuery 在单击时隐藏打开的 div 未显示,但仍将高度添加到导航中以使其看起来好像要掉下来了。 这个脚本工作正常: $(document).ready(funct
这个问题已经有答案了: How do I compare strings in Java? (23 个回答) 已关闭 4 年前。 这里是 Java 新手,我正在使用 NetBeans 尝试一些简单的代
如果我将它切换到 Python 2.x,它执行 10。这是为什么? 训练逻辑回归模型 import keras.backend as
我有两个脚本,它们包含在 HTML 正文中。在第一个脚本中,我初始化一个 JS 对象,该对象在第二个脚本标记中引用。 ... obj.a = 1000; obj.
每当我运行该方法时,我都会收到一个带有数字的错误 以下是我的代码。 public String getAccount() { String s = "Listing the accounts";
我已经用 do~while(true) 创建了我的菜单;但是每次用户输入一个数字时,它不会运行程序,而是再次显示菜单!你怎么看? //我的主要方法 public static void main(St
执行命令后,如何让IPython通知我?我可以使用铃声/警报还是通过弹出窗口获取它?我正在OS X 10.8.5的iTerm上运行Anaconda。 最佳答案 使用最新版本的iTerm,您可以在she
您好,我刚刚使用菜单栏为 Swing 编写了代码。但是问题出现在运行中。我输入: javac Menu.java java Menu 它没有给出任何错误,但 GUI 没有显示。这是我的源代码以供引用:
我觉得这里缺少明显的东西,但是我看不到它写在任何地方。 我使用Authenticode证书对可执行文件进行签名,但是当我开始学习有关它的更多信息时,我对原样的值(value)提出了质疑。 签名的exe
我正在设计一个应用程序,它使用 DataTables 中的预定义库来创建数据表。我想对数据表执行删除操作,为此应在按钮单击事件上执行 java 脚本。 $(document).ready(functi
我是 Haskell 新手,如果有人愿意帮助我,我会很高兴!我试图让这个程序与 do while 循环一起工作。 第二个 getLine 命令的结果被放入变量 goGlenn 中,如果 goGlenn
我有一个用 swing 实现迷你游戏的程序,在主类中我有一个循环,用于监听游戏 map 中的 boolean 值。使用 while 实现的循环不会执行一条指令,如果它是唯一的一条指令,我不知道为什么。
我正在尝试开发一个连接到 Oracle 数据库并执行函数的 Java 应用程序。如果我在 Eclipse 中运行该应用程序,它可以工作,但是当我尝试在 Windows 命令提示符中运行 .jar 时,
我正在阅读有关 Java 中的 Future 和 javascript 中的 Promises 的内容。下面是我作为示例编写的代码。我的问题是分配给 future 的任务什么时候开始执行? 当如下行创
我有一个常见的情况,您有两个变量(xSpeed 和 ySpeed),当它们低于 minSpeed 时,我想将它们独立设置为零,并在它们都为零时退出。 最有效的方法是什么?目前我有两种方法(方法2更干净
我是一名优秀的程序员,十分优秀!