ShardingJDBC不支持批量插入的一种解决办法

最近项目中需要进行分表就使用了ShardingJDBC做数据库中间层操作
之前sql中有写批量插入,而ShardingJDBC不支持insert xxx values(...),(...),(...)语句
故需要手动开启事务,循环插入并提交事务(与之前批量插入语句性能未做比较)

@Component
public class UserManager implements ApplicationContextAware {

    private static ApplicationContext applicationContext;
    @Autowired
    private UserDao UserDao;

    public void createUseres(List<User> UserList) {
        DefaultTransactionDefinition definition = new DefaultTransactionDefinition();
        definition.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
        definition.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);

        DataSourceTransactionManager transactionManager = (DataSourceTransactionManager)
                applicationContext.getBean("transactionManager");
        TransactionStatus transactionStatus = transactionManager.getTransaction(definition);

        for (User User : UserList) {
            //UserDao有create方法,单条插入
            applicationContext.getBean(UserDao.class).create(User);
        }

        transactionManager.commit(transactionStatus);
    }

    @Override
    public void setApplicationContext(ApplicationContext ac) throws BeansException {
        applicationContext = ac;
    }
}

转载于:https://www.cnblogs.com/chenvi/p/8340039.html

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用ShardingJDBC进行批量插入的示例代码: ``` import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import org.apache.shardingsphere.api.sharding.standard.PreciseShardingAlgorithm; import org.apache.shardingsphere.api.sharding.standard.RangeShardingAlgorithm; import org.apache.shardingsphere.api.sharding.standard.StandardShardingStrategyConfiguration; import org.apache.shardingsphere.driver.api.ShardingDataSourceFactory; import org.apache.shardingsphere.shardingjdbc.api.ShardingDataSource; import org.apache.shardingsphere.shardingjdbc.jdbc.core.datasource.ShardingDataSourceWrapper; import org.apache.shardingsphere.shardingjdbc.jdbc.core.statement.ShardingPreparedStatement; import org.apache.shardingsphere.shardingjdbc.jdbc.core.statement.ShardingStatement; import com.alibaba.druid.pool.DruidDataSource; public class ShardingJDBCBatchInsertExample { public static void main(String[] args) throws SQLException { // 配置分库 List<DruidDataSource> dataSourceList = new ArrayList<>(); for (int i = 0; i < 2; i++) { DruidDataSource dataSource = new DruidDataSource(); dataSource.setDriverClassName("com.mysql.jdbc.Driver"); dataSource.setUrl("jdbc:mysql://localhost:3306/db" + i + "?serverTimezone=UTC&useSSL=false"); dataSource.setUsername("root"); dataSource.setPassword("root"); dataSourceList.add(dataSource); } // 配置分表 PreciseShardingAlgorithm<Long> preciseShardingAlgorithm = (databaseNames, shardingValue) -> { for (String each : databaseNames) { if (each.endsWith(shardingValue.getValue() % 2 + "")) { return each; } } throw new UnsupportedOperationException(); }; RangeShardingAlgorithm<Long> rangeShardingAlgorithm = (databaseNames, shardingValue) -> { List<String> result = new ArrayList<>(); Long lowerValue = shardingValue.getValueRange().lowerEndpoint(); Long upperValue = shardingValue.getValueRange().upperEndpoint(); for (String each : databaseNames) { String value = each.substring(each.length() - 1); Long intValue = Long.parseLong(value); if (intValue >= lowerValue && intValue <= upperValue) { result.add(each); } } return result; }; StandardShardingStrategyConfiguration databaseShardingStrategyConfiguration = new StandardShardingStrategyConfiguration("id", preciseShardingAlgorithm, rangeShardingAlgorithm); ShardingDataSource shardingDataSource = ShardingDataSourceFactory.createDataSource(dataSourceList, Collections.singleton(databaseShardingStrategyConfiguration), new Properties()); // 执行批量插入 Connection conn = shardingDataSource.getConnection(); String sql = "insert into t_order (id, user_id, status) values (?, ?, ?)"; ShardingPreparedStatement pstmt = (ShardingPreparedStatement) conn.prepareStatement(sql); for (int i = 1; i <= 100; i++) { pstmt.setLong(1, i); pstmt.setLong(2, i % 10); pstmt.setString(3, "INIT"); pstmt.addBatch(); } pstmt.executeBatch(); conn.close(); } } ``` 该示例代码中,我们首先配置了两个Druid数据源,分别对应两个数据库db0和db1。然后,我们使用PreciseShardingAlgorithm和RangeShardingAlgorithm两种算法配置分库分表策略。具体而言,我们根据订单ID(id)的值来判断该订单属于哪个数据库和表,其中id % 2的值为0时,订单会被分配到db0数据库,否则分配到db1数据库;对于每个数据库,我们又根据id值的范围来判断该订单属于哪个表。 在执行批量插入时,我们首先通过shardingDataSource.getConnection()方法获取一个连接。然后,我们构造一个PreparedStatement对象,设置好参数,调用addBatch()方法将数据加入批处理队列中,最后调用executeBatch()方法执行批处理操作。由于使用了ShardingJDBC,ShardingPreparedStatement对象会在内部根据id值的分片规则自动将订单插入到对应的数据库和表中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值