2014-10-09 25 views
0

創建多個連接,並同時進行批量插入到mytable的(多線程)Teradata的多個連接INSERT僵局

insertString = "INSERT INTO ... + values + ") "; 
insertTable.addBatch(insertString); 
insertTable.executeBatch(); 
insertTable.clearBatch(); 

有時它工作得很好,但是在它掛起其他案件。我明白這是因爲我插入到同一個表中,所以它被鎖定。

我該如何編寫INSERT語句使其不鎖定表?

是否有可以防止表被鎖定任何特殊transaction start . .命令?另外,我很好奇它爲什麼有時可以正常工作?

PS:我用的最大連接數爲1024(完美的工作有時)

感謝

回答

1

1024會話完全瘋了。你的DBA應該阻止你的用戶。

當您加載具有相同PI多行你可能被阻塞的會話。

單行插入的數據加載速度最慢的方式。批量大小爲1000的單個會話將勝過數十個單行會話(但僅使用一個會話)。

或切換到JDBC FastLoad如果目標表是空的。

檢查 http://developer.teradata.com/connectivity/articles/speed-up-your-jdbcodbc-applications

這是一個臨時表?

+0

謝謝。我無法切換到Fastload,因爲它很糟糕。它需要超級乾淨的數據和許多其他限制。其實我正在使用'batch'。每個連接上傳一個800行的「批」,因此總共可以同時提交1024 * 800行。它曾經工作!我用特殊的方式編寫了我的代碼,這樣即使某個連接被阻塞,所有其他連接仍然會運行。被阻止的會話不是問題。我的問題是鎖定表 – Buras 2014-10-09 21:14:32

+0

我用那篇文章寫我的代碼,謝謝 – Buras 2014-10-09 21:16:54

+0

阻塞的會話是一個問題。當你使用'batch'運行多個會話時,如果有多個具有相同RowHash的行,將會很容易以死鎖結束。在使用多個會話時,無法鎖定表格(除非您想在CLI中使用FastLoad/MLoad協議編寫自己的加載工具)。你有沒有檢查登錄1024會話需要多長時間?如果這是臨時表,則可以切換到NO PRIMARY INDEX表以獲得更快的負載,但每個節點從不使用超過1到2個會話。爲什麼JDBC FastLoad需要比您的方法更清潔的數據? – dnoeth 2014-10-09 21:25:50