Sharding-jdbc报错:Missing the data source name:‘m0‘解决方案
作者:在奋斗的大道
在使用MyBatis-plus进行数据操作时,新增Order实体属性后,出现了数据源缺失的提示错误,原因是因为userId属性值使用了随机函数生成的Long值,这与sharding-jdbc的路由规则计算不匹配,导致无法找到正确的数据源,通过调整userId生成逻辑
异常描述
### Error updating database. Cause: java.lang.IllegalStateException: Missing the data source name: 'm0'
### The error may exist in com/zzg/mapper/OrderMapper.java (best guess)
### The error may involve com.zzg.mapper.OrderMapper.insert-Inline
### The error occurred while setting parameters
### Cause: java.lang.IllegalStateException: no table route info] with root cause
java.lang.IllegalStateException: no table route info
异常造成原因
@RequestMapping(value = "/batchInsert", method = { RequestMethod.GET }) public Object batchInsert() { for (int i = 0; i < 10; i++) { Order order = new Order(); order.setPrice(new BigDecimal(Math.random())); order.setUserId(new Random().nextLong()); order.setStatus("0"); orderService.save(order); } return "批量新增成功"; }
使用MyBatis-plus 新增Order 实体属性时,提示Missing the data source name: 'm0'
造成原因是由于userId的属性值,我使用的是随机函数生成的Long 值进行填充,导致sharding-jdbc 路由引擎执行分析时与自己定义的数据库规则计算值异常导致输出了一个不存在的数据源。
调整后的插入功能代码:
@RequestMapping(value = "/batchInsert", method = { RequestMethod.GET }) public Object batchInsert() { for (int i = 0; i < 10; i++) { Order order = new Order(); order.setPrice(new BigDecimal(Math.random())); order.setUserId(Long.valueOf("" + i)); order.setStatus("0"); orderService.save(order); } return "批量新增成功"; }
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。