2014-10-09 241 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