首页 文章

cassandra - 高并发读写应用程序问题

提问于
浏览
1

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

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

该项目的持续过程如下:

1)创建项目并计算其哈希值 . 2)然后在第二个表中执行对哈希的查找,该表将哈希值与项目的uuids相对应 . 3)如果找到hash-uuid对,则正在执行uuid项的查找(第一个表),并且由于该项必须存在(因为找到了“hash-uuid”对),所以从cassandra到JPA,之后又更新了 . 如果未找到“hash-uuid”对,则会在相应的表中创建一个新项,并且还会保存新的“hash-uuid”对 .

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

在第二步中,整个算法再次运行,但已经在填充的数据表上运行 . 在此步骤中,在通过相应的uuids(主键)读取数据项时发生随机错误 - 有时服务器不会重新调整完整的文本数据(正确的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的默认值(主键查找期间发生了超时)

1 回答

  • 1

    我怀疑你的代码没有以线程安全的方式使用Cassandra连接:必须注意只允许一个线程一次访问一个连接 . 我不知道Kundera如何处理这个问题,因为JPA会为Cassandra生成非常低效的查询,我不推荐它 . 请参阅data modeling resources here,然后使用native CQL java driver .

相关问题