我正在開發一個應該接收來自數百個業務部門的夜間報告的服務器。報告目前是加密的csv文件。這些報告總共應該每天保存在數據庫中以供日後使用,其數量應達到50萬到100萬條。如何在併發批處理中繞過JDBC語句緩存?
我爲每個傳輸創建了一組PreparedStatements。這些語句用於在執行和提交之前批量處理50條記錄。每個記錄可能會導致多達20個數據庫插入。當傳輸排隊並逐個處理時一切正常。
因爲我試圖同時做到這一點,我注意到不同的線程得到了完全相同的PreparedStatements實例。這引起了以下問題
- 多個線程添加語句到同一批次當任何線程決定是時候這樣做
- 提交被調用時數據庫沒有達到它的
- 批次正在執行約束一些線程還沒有來得及使用某些語句
的問題是:是那裏是要創建一種強制一份聲明而不是重用現有從語句緩存?
如果不是有沒有更好的方式來處理比
- 創建不具有語句/連接池
- 從數據庫中取消約束批次單獨的數據源的情況;插入順序也沒有什麼關係了
- 迫使順序處理
編輯:試圖澄清這一問題
要有線程T1和T2。 讓我們準備好陳述S1和S2。 讓批次B1和B2。
每次使用S1時,都將其添加到B1中。每次使用S2時,它都被添加到B2中。 提交時,必須在每個外鍵約束S2之前提交S1。當
- T1處理傳輸興高采烈
- T2處理傳輸發生
問題無辜
- T1使用語句S1添加S1A到含有批量B1 S1A
- T1使用語句S2添加S2A批量B2包含s2a
- T1決定是時候提交
- T1提交batch B1 contai寧S1A
- T2使用S1添加S1b到含有批量B1 S1B
- T2使用S2添加含有S2A S2B到批次B2,S2B
- T1提交批處理B1 containting S2A,S2B
- 數據庫說 '否'因爲s2b是在外鍵禁止的s1b之前提交的。
這可以避免與手動同步以及指出的答案,但然後我仍然需要分別跟蹤每個批次的大小,而不是應用每個線程的本地邏輯。
您必須使用供應商特定的方法來執行您所需的操作。你在使用哪種RDBMS? – Juris 2009-08-25 11:41:01
Aww。這真的不是我想聽到的。目前該測試系統在Apache Derby上運行。生產數據庫將是Oracle 10g或R – 2009-08-25 11:54:47
我會給予兩個答案upvote,因爲他們幫助我考慮了我的問題。我會提供我在設法測試時選擇的解決方案。 – 2009-08-26 04:24:11