3.1000万条必须要分库分表
String table = "success_killed_"+userId%8; nativeSql = "INSERT INTO "+table+" (seckill_id, user_id,state,create_time)VALUES(?,?,?,?)"; Object[] params = new Object[]{seckillId,userId,(short)0,new Timestamp(System.currentTimeMillis())}; dynamicQuery.nativeExecuteUpdate(nativeSql,params);手动撕业务逻辑是不是很low?今天给大家推荐一款分表神器。
2.支持任意实现JDBC规范的数据库。目前支持 MySQL,Oracle,SQLServer,PostgreSQL以及任何遵循SQL92标准的数据库。
<dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>sharding-jdbc-spring-boot-starter</artifactId> <version>4.0.1</version> </dependency> <dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>sharding-jdbc-spring-namespace</artifactId> <version>4.0.1</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.23</version> </dependency>配置文件 application.properties:
server.port=8080 spring.jpa.database=mysql spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true spring.shardingsphere.datasource.names=ds spring.shardingsphere.datasource.ds.type=com.alibaba.druid.pool.DruidDataSource spring.shardingsphere.datasource.ds.driver-class-name=com.mysql.cj.jdbc.Driver spring.shardingsphere.datasource.ds.url=jdbc:mysql://localhost:3306/shardingsphere?serverTimezone=UTC&useSSL=false spring.shardingsphere.datasource.ds.username=root spring.shardingsphere.datasource.ds.password=root spring.shardingsphere.datasource.ds.max-active=16 spring.shardingsphere.sharding.tables.t_order.actual-data-nodes=ds.t_order_$->{0..1} spring.shardingsphere.sharding.tables.t_order.table-strategy.inline.sharding-column=order_id spring.shardingsphere.sharding.tables.t_order.table-strategy.inline.algorithm-expression=t_order_$->{order_id % 2} #自增列名称,缺省表示不使用自增主键生成器 spring.shardingsphere.sharding.tables.t_order.key-generator.column=order_id #自增列值生成器类型,缺省表示使用默认自增列值生成器。可使用用户自定义的列值生成器或选择内置类型:SNOWFLAKE/UUID spring.shardingsphere.sharding.tables.t_order.key-generator.type=SNOWFLAKE #工作机器唯一id,默认为0,最大1024 spring.shardingsphere.sharding.tables.t_order.key-generator.props.worker.id=6定义实体类,项目启动会自动生成表,也可以手动创建表:
@Data @Entity @Table(name = "t_order") public final class OrderEntity{ private static final long serialVersionUID = 4743102234543827854L; /** * 堆代码 duidaima.com * 订单ID */ @Id @Column(name = "order_id") @GeneratedValue(strategy = GenerationType.IDENTITY) private long orderId; /** * 商品ID */ @Column(name = "goods_id") private long goodsId; /** * 用户ID */ @Column(name = "user_id") private int userId; /** * 支付状态 1 支付完成 0 支付中 */ @Column(name = "pay_status") private short payStatus; }模拟订单插入:
@Api(tags ="订单管理") @RestController @RequestMapping("/order") public class OrderControl { @Autowired private OrderRepository orderRepository; /** * 插入 */ @PostMapping("/save") public void save(){ for(int i=0;i<10;i++){ OrderEntity entity = new OrderEntity(); entity.setUserId(i); entity.setGoodsId(1000L); entity.setPayStatus((short)0); orderRepository.save(entity); } } }模拟订单插入,执行请求,向数据库插入十条订单,查看数据库,如果表t_order_0和t_order_1分别有5条记录,说明配置成功。