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

时间:2014-05-05 08:06:05

标签: java jpa cassandra cassandra-2.0 kundera

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

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

项目持续的过程如下:

1)创建项目并计算其哈希值。 2)然后在第二个表中执行对散列的查找,其相应地对项目的uuids进行散列。 3)如果找到hash-uuid对,则正在执行uuid项的查找(第一个表),并且由于该项必须存在(因为找到了" hash - uuid"对),该项目从cassandra加载到JPA,然后更新。当没有"哈希 - uuid"找到对,在相应的表中创建一个新项目和一个新的" hash - uuid"对也被保存。

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

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

我完全确定,我的算法是正确的,因为同样的算法与hibernate和mysql一起工作,即使使用postgresql(但由于我需要更快的写入,我还在玩cassandra)。 / p>

我正在使用带有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 个答案:

答案 0 :(得分:1)

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