我有一个Java应用程序,它从一组表中读取,处理数据,然后将处理后的数据插入到一个表中。 数据量非常大,多线程是不可避免的。 当多个线程同时尝试插入时会发生问题,这会导致写保持和插入保持。之后,所有线程都等待表可用,直到连接超时。
正在插入的记录没有任何指向任何表的外键
插入的记录完全相互独立
该表没有任何排序的增量ID
没有其他应用程序正在使用此应用程序中涉及的任何表
我正在使用Java预处理语句来执行插入操作。每个调用一个insert方法,它分别为每个线程打开一个连接。
我有什么问题或者是Redshift的兼容性问题吗?
答案 0 :(得分:3)
在具有单独连接的Redshift表中执行大量小插入绝对是not what you want to do。 Redshift WLM query queues不适合许多小型并发操作。默认情况下,只会同时运行5个查询,并且您希望保存实际工作查询的查询,而不是loading。当您考虑Redshift针对非常大的数据集上的少量长时间运行查询进行优化时,这是有道理的。
对于您的情况,我建议您查看使用Kinesis Firehose到load your data into Redshift。它专为此目的而设计,您可以从许多线程有效地写入它。如果需要,它batch the data for you可以为您提供过滤/转换数据的机会,如果需要,还可以备份到S3。
这是Java example。