Apache camel 如何在ApacheCamel中设置一组流式SQL插入

Apache camel 如何在ApacheCamel中设置一组流式SQL插入,apache-camel,Apache Camel,我有一个文件,其中包含超过300万个以管道分隔的行,我希望将这些行插入到数据库中。这是一个简单的表格(无需标准化) 设置路由以监视文件、使用流模式读取文件并拆分行很容易。向表中插入行也是一项简单的接线工作 问题是:如何使用批处理插入来实现这一点?假设1000行是最佳的。。如果文件是流式传输的,SQL组件如何知道流已经完成。假设该文件有3000001条记录。如何设置Camel以插入最后一条流浪记录 一次插入一条线是可以做到的,但速度会非常慢。这可以使用Camel-Spring批处理组件来完成,每个

我有一个文件,其中包含超过300万个以管道分隔的行,我希望将这些行插入到数据库中。这是一个简单的表格(无需标准化)

设置路由以监视文件、使用流模式读取文件并拆分行很容易。向表中插入行也是一项简单的接线工作

问题是:如何使用批处理插入来实现这一点?假设1000行是最佳的。。如果文件是流式传输的,SQL组件如何知道流已经完成。假设该文件有3000001条记录。如何设置Camel以插入最后一条流浪记录


一次插入一条线是可以做到的,但速度会非常慢。

这可以使用Camel-Spring批处理组件来完成,每个步骤的提交量可以由CommitterVal定义,作业的编排在spring配置中定义。它非常适用于类似于您的需求的用例。
下面是github的一个很好的例子:

我建议如下:

from("file:....")
    .split("\n").streaming()
        .to("any work for individual level")
        .aggregate(body(), new MyAggregationStrategy().completionSize(1000).completionTimeout(50)
            .to(sql:......);

我没有验证所有语法,但计划是抓取文件,将其与流分开,然后聚合1000个组,并有一个超时来捕获最后一个较小的组。这些聚合的组可以简单地使主体成为字符串列表,或是批量sql插入所需的任何格式。

以下是更准确的示例:

@Component
@Slf4j
public class SQLRoute extends RouteBuilder {

  @Autowired
  ListAggregationStrategy aggregationStrategy;

  @Override
  public void configure() throws Exception {
    from("timer://runOnce?repeatCount=1&delay=0")
        .to("sql:classpath:sql/orders.sql?outputType=StreamList")
        .split(body()).streaming()
          .aggregate(constant(1), aggregationStrategy).completionSize(1000).completionTimeout(500)
            .to("log:batch")
            .to("google-bigquery:google_project:import:orders")
          .end()
        .end();
  }

  @Component
  class ListAggregationStrategy implements AggregationStrategy {

    public Exchange aggregate(Exchange oldExchange, Exchange newExchange) {
      List rows = null;

      if (oldExchange == null) {
        // First row ->
        rows = new LinkedList();
        rows.add(newExchange.getMessage().getBody());
        newExchange.getMessage().setBody(rows);
        return newExchange;
      }

      rows = oldExchange.getIn().getBody(List.class);
      Map newRow = newExchange.getIn().getBody(Map.class);

      log.debug("Current rows count: {} ", rows.size());
      log.debug("Adding new row: {}", newRow);

      rows.add(newRow);
      oldExchange.getIn().setBody(rows);

      return oldExchange;
    }
  }
}

谢谢你的回复,但我不确定这是如何解决我的问题。批处理框架如何解决数据库中的流问题?我知道如何使用常规Spring设置批处理-设置起来非常简单。但在从文件流式传输时这样做对我来说并不明显。我同意这是两种完全不同的方法,spring批处理是一种单独的路由,而不是从camel:file端点,然后是FlatFileItemReader:,流式传输文件,只有当流式传输完成后,流才会传递给处理器,随后,写入程序保存到数据库中,这样就避免了流问题。然而,我甚至不完全确定这两种方法的结合将如何发挥作用。不幸的是,我需要流式处理方法,因为文件只会越来越大,我想保持VM的大小较小。如果我不需要担心流媒体,我会简单地使用Bindy放入一个列表,然后发送给处理器,为我划分成块。谢谢,谢谢。这就是我现在正在尝试的。棘手的一点是检测流的结束,使用超时是可以的,但我正在考虑在处理之前在输入文件中附加一个结束标记,以便我可以检测到这一点并设置适当的标头超时确实感觉不干净。我想知道是否有人有更好的方法?最后我不能和骆驼一起去——在最后使用一个暂停会让人感觉不舒服,我无法让它以任何其他方式工作。我求助于一个简单的BufferedLineReader和Spring模板,一次批处理1000行。性能确实非常好。这一个也有一个超时来“完成”流。