1

我正在实现一个应用程序,它在 4 个线程中生成数十万行。每个线程打开一个到 cassandra 的单独连接。

表的每一项都有一个唯一的哈希标识符(字符串),但主键是一个 uuid。

项目持久化的过程如下:

1) 创建项目并计算其哈希值。2) 然后在第二个表中执行散列查找,该表将散列与项目的 uuid 相应地配对。3) 如果找到一个哈希 - uuid 对,则正在执行对项目 uuid 的查找(再次是第一个表),并且由于该项目必须存在(因为找到了一个“哈希 - uuid”对),所以从加载项目cassandra 到 JPA,然后更新。当没有找到“hash - uuid”对时,在相应的表中创建一个新项目,并保存一个新的“hash - uuid”对。

数据生成有两个步骤。第一步是使用空表运行并生成第一个数据集。那里没有错误发生,因为在步骤 nr. 3、永远找不到“hash - uuid”对,因此不会发生更新。

在第二步中,整个算法再次运行,但已经在填充的数据表上运行。在此步骤中,通过相应的 uuid(主键)读取数据项时会发生随机错误 - 有时服务器不会返回完整的文本数据(正确的 JSON 字符串存储在表中,但不完整的 JSON 字符串会检索到应用程序中)。

我完全确定,我的算法是正确的,因为相同的算法适用于 hibernate 和 mysql,甚至适用于 postgresql(但由于我需要更快的写入,我正在使用 cassandra)。

我正在使用具有 16 GB RAM 的 macbook pro,与 cassandra 一起使用我使用 Kundera 库(支持 JPA)。至于cassandra,我试过datastax 2.0.4版本,还有直接从Apache网站下载的2.0.7版本。没有集群,只有一个实例在我的机器上本地运行,在外部 SSD 驱动器上。昆德拉正在使用 CQL v3。

有谁知道,这种行为是如何发生的?datastax cassandra 驱动程序或 Kundera 中是否存在错误?还是我使用 cassandra 错误并且不应该以这种方式使用数据库?或者是否有任何我可能忘记的配置调整?

我在 cassandra 配置文件中唯一更改的是所有超时,因为我得到了太多默认值的 TimeoutExceptions(在主键查找期间发生超时)

4

1 回答 1

1

我怀疑您的代码没有以线程安全的方式使用 Cassandra 连接:必须注意一次只允许一个线程访问连接。我不知道 Kundera 是如何解决这个问题的,因为 JPA 会为 Cassandra 生成非常低效的查询,我不推荐它。请参阅此处的数据建模资源,并使用本机 CQL java 驱动程序

于 2014-05-07T14:51:48.603 回答