我正在实现一个应用程序,它在4个线程中生成数十万行。每个线程打开一个到cassandra的单独连接。
表中的每一项都有一个惟一的散列标识符(字符串),但主键是一个uuid。
项目持久化的过程如下:
1)创建项并计算其哈希值。2)然后在第二个表中执行对散列的查找,该表根据项目的uuid对散列进行配对。3)如果找到hash - uuid对,则执行对项uuid的查找(再次执行第一个表),由于该项必须存在(因为找到了"hash - uuid“对),因此该项从cassandra加载到JPA并随后进行更新。当没有找到"hash - uuid“对时,会在相应的表中创建一个新项目,并保存一个新的"hash - uuid”对。
数据生成有两个步骤。第一步是使用空表运行并生成第一个数据集。没有错误发生,因为在步骤nr中。3,永远不会找到"hash - uuid“对,因此不会发生更新。
在第二步中,整个算法再次运行,但已经在填充的数据表上运行。在此步骤中,通过相应的uuid(主键)读取数据项时会发生随机错误-有时服务器不会返回完整的文本数据(适当的JSON字符串存储在表中,但不完整的JSON字符串被检索到应用程序中)。
我完全确定,我的算法是正确的,因为同样的算法适用于hibernate和mysql,甚至是postgresql (但由于我需要更快的写入速度,我正在尝试cassandra)。
我使用的是16 GB内存的macbook pro,使用cassandra时,我使用的是Kundera库(支持JPA)。至于cassandra,我试过DataStax2.0.4版本,也试过直接从Apache站点下载的2.0.7版本。没有集群,只有一个实例在我的机器上本地运行,在外部SSD驱动器上。昆德拉正在使用CQL v3。
有没有人知道这种行为是如何发生的?datastax cassandra驱动程序或Kundera中是否存在错误?或者我使用cassandra是错误的,数据库不应该以这种方式使用?或者有没有什么我可能忘记的配置调整?
我在cassandra配置文件中唯一更改的是所有超时,因为我使用默认值获得了太多的TimeoutExceptions (超时发生在主键查找期间)。
发布于 2014-05-07 22:51:49
我怀疑您的代码没有以threadsafe的方式使用Cassandra连接:必须注意一次只允许一个线程访问一个连接。我不知道Kundera是如何实现这一点的,因为JPA将为Cassandra生成非常低效的查询,我不推荐这样做。查看data modeling resources here并使用native CQL java driver。
https://stackoverflow.com/questions/23467724
复制相似问题