本文参考 文章
由于分库分表,一个logic table在不同DB,不同physical table中需要实现unique的primary key。但是由于不同physical table之间对于自增ID是无感的,可能造成primary key重复。
我们需要引进ID生成服务来与底层ID生成分离。Sharding-jdbc提供主键生成器,就是一个会生成不重复Long值的类。该生成器生成的数据为64bit的long型数据,数据库中应该用大于等于64bit的数字类型的字段来保存该值,比如在MySQL中应该使用BIGINT。
依赖:
com.dangdang
sharding-jdbc-self-id-generator
${sharding-jdbc.version}
在DataSourceConfiguration.java 中创建bean.
@Bean
public IdGenerator getIdGenerator() {
return new CommonSelfIdGenerator();
}
使用IdGenerator
@RestController
@RequestMapping("/order")
public class OrderController {
@Autowired
private OrderRepository orderRepository;
@Autowired
private IdGenerator idGenerator;
@RequestMapping("/add")
public Object add() {
Order order = new Order();
order.setUserId(1L);
order.setOrderId(idGenerator.generateId().longValue());
orderRepository.save(order);
return "success";
}
@RequestMapping("query")
private Object queryAll() {
return orderRepository.findAll();
}
}