我正在使用Cassandra进行我的项目,而且在写作过程中我遇到了超时问题,这个人在这篇帖子中收到了同样的信息Cassandra cluster with bad insert performance and insert stability(目前我只用一个测试节点,Java驱动程序,最后一个版本的Cassandra)。应用程序必须每天(每晚)在每个用户插入大量数据。我有一个接受文件的休息控制器,然后在它们并行到达时处理它们以在Cassandra中插入值。我必须为每个用户插入1百万个条目,其中一个条目最多有8个值(时间不是那么重要,也可能需要10分钟)。按照Cassandra cluster with bad insert performance and insert stability中提供的答案,我决定将executeAsync(),Semaphore和PreparedStatement添加到我的应用程序中,而之前我没有使用它们。
现在的问题是,使用变量键空间(每个用户一个)并且需要更新数据库中的列表,我无法在初始化阶段初始化PreparedStatements但我必须至少执行一次处理每个文件(一个文件包含10 + k个条目),用户每天最多需要上传100个文件。出于这个原因,我收到了这个警告:
Re-preparing already prepared query INSERT INTO c2bdd9f7073dce28ed973238ac85b6e5d6162fce.sensorMonitoringLog (timestamp, sensorId, isLogging) VALUES (?, ?, ?). Please note that preparing the same query more than once is generally an anti-pattern and will likely affect performance. Consider preparing the statement only once.
我的问题是:使用像这样的PreparedStatement是一个好习惯,还是最好使用带有executeAsync()的普通插入?
谢谢
答案 0 :(得分:0)
如果您在写入期间遇到超时问题,最好使用PreparedStatement但不要使用异步插入。超时是防止Cassandra超负荷工作的一种方法。使用异步,您可以同时为其提供更多工作,并且OOM的风险会增加。
要使用PreparedStatement正确执行操作,您必须按键空间创建一个且仅一个Session对象。然后每个会话必须准备一次自己的声明。
此外,请注意它们是PreparedStatement和异步的线程安全风险。必须同步准备语句。但是我再一次建议你不要在这种情况下使用ExecuteAsynch。