【问题标题】:How to use ItemWriter to execute mysql LOAD DATA INFILE?如何使用 ItemWriter 执行 mysql LOAD DATA INFILE?
【发布时间】:2017-08-17 10:18:46
【问题描述】:

我想创建一个spring-batch 作业以将 csv 内容(内存中)批量加载到mysql 数据库中。

我必须调用Statement 本身的setter。 st.setLocalInfileInputStream(..).

问题:我尝试使用ItemPreparedStatementSetter,但是里面的PreparedStatement只是一个私有代理,不能强制转换为语句,得到异常:

java.lang.ClassCastException: com.sun.proxy.$Proxy74 cannot be cast to com.mysql.jdbc.Statement

那么,如何使用ItemWriter 来执行批量插入?

以下不起作用:

    JdbcBatchItemWriter<String> writer = new JdbcBatchItemWriter<>();
    writer.setDataSource(ds);
    writer.setSql("LOAD DATA LOCAL INFILE '' into table mytable");

    ItemPreparedStatementSetter<String> ps = new ItemPreparedStatementSetter<String>() {
        @Override
        public void setValues(String csv, PreparedStatement ps) throws SQLException {
            //this fails
            ((com.mysql.jdbc.Statement) ps).setLocalInfileInputStream(new ByteArrayInputStream(csv.getBytes()));
        }
    };

    writer.setItemPreparedStatementSetter(ps);
    writer.write(Arrays.asList(content));

【问题讨论】:

  • 您找到解决方案了吗?谢谢
  • 不幸的是,我没有放弃 spring-batch 框架。

标签: java mysql spring spring-batch


【解决方案1】:

在 Spring Batch 中,通过准备好的语句管道 CSV 不是基于块的编写器的用途。这确实是Tasklet 实现的任务。从那里,您将对收到的报表等有更多的控制权。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-01
    • 2012-10-05
    • 2010-11-17
    • 1970-01-01
    • 2015-03-11
    • 2012-06-03
    • 2020-07-25
    相关资源
    最近更新 更多