Redshift表中的多线程插入导致锁定

时间:2017-02-14 13:16:45

标签: java multithreading console-application amazon-redshift

我有一个Java应用程序,它从一组表中读取,处理数据,然后将处理后的数据插入到一个表中。 数据量非常大,多线程是不可避免的。 当多个线程同时尝试插入时会发生问题,这会导致写保持和插入保持。之后,所有线程都等待表可用,直到连接超时。

  • 正在插入的记录没有任何指向任何表的外键

  • 插入的记录完全相互独立

  • 该表没有任何排序的增量ID

  • 没有其他应用程序正在使用此应用程序中涉及的任何表

我正在使用Java预处理语句来执行插入操作。每个调用一个insert方法,它分别为每个线程打开一个连接。

我有什么问题或者是Redshift的兼容性问题吗?

1 个答案:

答案 0 :(得分:3)

在具有单独连接的Redshift表中执行大量小插入绝对是not what you want to doRedshift WLM query queues不适合许多小型并发操作。默认情况下,只会同时运行5个查询,并且您希望保存实际工作查询的查询,而不是loading。当您考虑Redshift针对非常大的数据集上的少量长时间运行查询进行优化时,这是有道理的。

对于您的情况,我建议您查看使用Kinesis Firehoseload your data into Redshift。它专为此目的而设计,您可以从许多线程有效地写入它。如果需要,它batch the data for you可以为您提供过滤/转换数据的机会,如果需要,还可以备份到S3。

这是Java example