【发布时间】:2014-06-21 11:23:20
【问题描述】:
我正在实现一个应用程序,它在 4 个线程中生成数十万行。每个线程打开一个到 cassandra 的单独连接。
表的每一项都有一个唯一的哈希标识符(String),但主键是一个uuid。
item持久化的过程如下:
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 驱动器上。 Kundera 正在使用 CQL v3。
有人知道这种行为是如何发生的吗? datastax cassandra 驱动程序或 Kundera 中是否存在错误?还是我使用 cassandra 错误并且不应该以这种方式使用数据库?或者有什么我可能忘记的配置调整?
我在 cassandra 配置文件中唯一更改的是所有超时,因为我收到了太多默认值的 TimeoutExceptions(在主键查找期间发生超时)
【问题讨论】:
-
如果有人有兴趣,这里有更详细的问题描述:github.com/impetus-opensource/Kundera/issues/587
标签: java jpa cassandra cassandra-2.0 kundera