2015-11-21 33 views
1

我遇到了多個線程插入數據庫中的單個表使用休眠的問題。每個線程都會生成一些數據,然後將它們插入到表中。問題在於插入僅由一個線程處理,因爲數據庫鎖定。什麼是最好的解決方法,所以線程可以同時插入?我試圖有1個專用線程將寫入表中,其他人將生成數據。但數據生成方式更快,然後插入,所以它不能解決我的問題。將多個線程寫入單個數據庫表

我唯一的想法是爲每個線程創建自己的數據庫/表,但這對我來說似乎有點不可思議,因爲我不知道我會提前創建多少個線程。有更好的解決方案嗎?

+0

可能的交易。因爲如果插入一點點,那麼無論線程如何,每秒鐘的事務量都會受到限制。如果您將數據綁定到更大的事務中,您可以提高吞吐量,因爲每秒事務數限制並不關心事務的大小。 https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/batch.html更多的線程意味着更多的爭用,這意味着降低性能 – zapl

+0

將數據庫更改爲Oracle,它會創建重做日誌並寫入每個線程。 –

+0

如果您生成的數據太快而無法正確設置數據庫來處理(意味着您已適當調整了硬件和日誌記錄,並且僅使用READ COMMITTED),那麼SQL幾乎肯定不是合適的數據商店。 – chrylis

回答

1

您必須保留一個隊列以保持要插入的數據。所以所有的處理線程都可以將數據插入隊列。一旦你的插入線程插入數據到數據庫,你可以從隊列中刪除它。

+0

您錯過了'數據生成方式更快然後插入',所以即使沒有代碼,這個評論也不能解決問題。 –

+0

@nikpon我不會像你說的那樣錯過它。這就是爲什麼我建議一個隊列在插入到數據庫之前處理生成的數據。 – Steephen

相關問題