2014-05-05 53 views
1

我正在實現一個應用程序,它在4個線程中生成數十萬行。每個線程打開與cassandra的單獨連接。cassandra - 高併發讀寫應用程序問題

表中的每一項都有一個唯一的散列標識符(String),但主鍵是一個uuid。

持續的項目的過程如下:

1)被創建的項目和其散列計算。 2)然後在第二個表中執行散列查找,該表將散列值與項目的uuids對應。 3)如果找到了一個hash-uuid對,那麼將會執行對uuid項的查找(第1個表再次),並且由於該項必須存在(因爲找到了「hash-uuid」對),所以該項目被加載從cassandra到JPA,並在之後進行更新。如果找不到「hash-uuid」對,則會在相應的表中創建一個新項目,並保存一個新的「hash-uuid」對。

數據生成有兩個步驟。第一步是使用空表運行並生成第一個數據集。沒有錯誤發生,因爲在步驟nr。 3,從來沒有找到「hash-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錯誤,數據庫不應該以這種方式使用?或者有沒有我可能已經忘記的配置調整?

我已經卡桑德拉配置文件中唯一改變的是所有的超時,因爲我正在使用缺省值太多TimeoutExceptions(在主鍵查詢超時發生)

+0

如果有人會感興趣,下面是關於這個問題的更詳細的描述:https://github.com/impetus-opensource/Kundera/issues/587 – rastusik

回答

1

我懷疑你的代碼是不是以線程安全的方式使用Cassandra連接:必須注意一次只允許一個線程訪問連接。我不知道昆德拉如何解決這個問題,因爲JPA會爲Cassandra生成令人難以置信的低效查詢,我不推薦它。請參閱data modeling resources here,並使用native CQL java driver

+0

感謝您的答案,這正是我懷疑。查詢生成沒有問題,因爲即使使用JPA,查詢也只是基本的主鍵查找。我懷疑問題出在昆德拉身上,我只是要求確定,我沒有進行任何數據操作,而這些數據操作不應該由卡桑德拉以我正在處理的方式處理。 – rastusik