apache / shardingsphere

Empowering Data Intelligence with Distributed SQL for Sharding, Scalability, and Security Across All Databases.
Apache License 2.0
19.95k stars 6.74k forks source link

Support batch INSERT #290

Closed terrymanu closed 6 years ago

terrymanu commented 7 years ago

支持批量insert语句,例:

INSERT INTO t_table (xx, xx) VALUES (xx,xx), (xx,xx), (xx,xx);

yinjw commented 7 years ago

急需该功能,循环新增数据太慢了

tian6318 commented 7 years ago

亮哥这么棒现在支持批量执行的语句了?

igool commented 6 years ago

请问现在要支持批量的话,只能单独更新这几个类吗?有没有分支可以直接使用?

Comven commented 6 years ago

@terrymanu 建议亮哥优先考虑下支持透传方式执行sql,这样sharding-jdbc短时间不支持批量insert方式也能够通过透传方式,完成单一物理表的批量insert,毕竟在数据量较大的时候批量insert执行效率比一条一条的插入好太多。

githublaohu commented 6 years ago

批量instet 能解析出来吗?

wgou commented 6 years ago

建议亮哥优先考虑下支持透传方式执行sql,这样sharding-jdbc短时间不支持批量insert方式也能够通过透传方式,完成单一物理表的批量insert,毕竟在数据量较大的时候批量insert执行效率比一条一条的插入好太多。

lazio579 commented 6 years ago

insert多条语句,按道理是需要分布式事务配合的,如果不嫌弃网易中间件的话,可以尝试我们的:https://github.com/Lede-Inc/cetus

githublaohu commented 6 years ago

哥们,牛头不对马嘴啊。

lazio579 commented 6 years ago

批量插入,如果涉及到多个分库,当然需要分布式事务了

githublaohu commented 6 years ago

这个issues的问题是,insert解析与路由的问题。 sharding-jdbc支持两段提交啊

lazio579 commented 6 years ago

在哪儿支持,我没有发现有任何xa的机制

lazio579 commented 6 years ago

官方也只是说:

BASE Transaction

并不是真正的分布式事务

githublaohu commented 6 years ago

如果不支持两段提交,sharding-jdbc能上正式环境 两段提交,非常简单,需要纠结吗?

githublaohu commented 6 years ago

AbstractConnectionAdapter 看下这个类吧

PrimaryKey3610 commented 6 years ago

insert into test ( A , B , C , D)VALUES('这是第0A','这是第0B','这是第0C','这是第0D'), ('这是第1A','这是第1B','这是第1C','这是第1D'), ('这是第2A','这是第2B','这是第2C','这是第2D'); Disconnected from the target VM, address: '127.0.0.1:63898', transport: 'socket' 2018-03-21 17:15:08.299 ERROR 15844 --- [ main] c.alibaba.druid.filter.stat.StatFilter : merge sql error, dbType mysql, sql : insert into test_0 ( A , B , C , D, id)VALUES, 183266118457098240);

com.alibaba.druid.sql.parser.ParserException: syntax error, expect ')', pos 46, line 2, column 28, token COMMA

这是为啥啊? 是按照批量格式来的啊

PrimaryKey3610 commented 6 years ago
            InsertStatement insertStatement = (InsertStatement)new SQLParsingEngine(DatabaseType.MySQL, insertSQL, shardingRule).parse();

这样写并没有更新. 这句代码是InsertStatementParserTest.java中找到的.

dingmengyang commented 6 years ago

我参照example那的springboot项目配置,批量插入还是不行。

io.shardingjdbc sharding-jdbc-core-spring-boot-starter 2.0.3

需要2.1.0吗?(maven上现在只能获取2.0.3版本的)

wgou commented 6 years ago
connection = DataSourceUtils.getConnection(dataSource);
        statement = connection.prepareStatement(sql);
        int rows = 0,count = 0;
        for(RebBusiLedgerDO busi : busiLedger){
            int idx =1;
            statement.setString(idx++, busi.getContractNo());
            statement.setString(idx++, busi.getSupplierCode());
            statement.setString(idx++, busi.getBusiNo());
            statement.setString(idx++, busi.getLedgerNo());
            statement.setInt(idx++, busi.getStatus());
            statement.setString(idx++, busi.getLedgerNo());
            statement.addBatch();
            count++;rows++;
            if (count % 5000 == 0) {
                statement.executeBatch();
                count = 0;
               }
           }
        if (count != 0) {
            statement.executeBatch();
        }

2.1以下版本 按照分表规则拆分N个集合,然后做这种批量不是很完美么?

terrymanu commented 6 years ago

fixed at 3.0.0.M1

codehorde commented 6 years ago

只支持很简单的sql语法,虽然有dialect但很多语法都不支持

ratyzhang commented 5 years ago

@terrymanu 亮哥 INSERT INTO t_table_yymmdd (xx, xx,....M) VALUES (xx,xx,....M), (xx,xx,....M), (xx,xx,....M) ....N 当M(字段数)N(记录数)比较大,进行分表操作时,如50020时,sql执行非常慢,基本上卡死了。根据debug 应该问题出在 sqlRoute 和 sqlParse 这块。请确认。备注:版本为3.1.0

Mirrormiss commented 4 years ago

亮哥,在集成mybatis的时候 ,使用了批量新增,发现报了一个莫名的错误 (Parameter 'XXX' not found. Available parameters are [A, B]), 大致看了下,是不是因为单表mybatis的Invocation中是一条SQL,而批量的是一个集合,导致ShardingValue中的分片键和分片键的值对应不上的原因? 备注:版本为3.1.0

yangyun-zero commented 4 years ago

亮哥,插入多条数据,分表后,很慢,这个有什么方式可以解决吗