问题
原项目中,数据库用的是单台数据库。现改成读写分离的两台数据库服务器。用的是shardingsphere。更新之后,项目中某个模块实体都是用MySQL自动生成策略的,ORM框架用的是tk-mybatis。报错异常如下:
ExecutorException: Error selecting key or setting result to parmeter object.Cuse: ParseCalcellationException...
原因分析
代码实体类中,我是采用了
@Id
@KelSql(sql = "select uuid_short() from dual")
private String id;
在数据库读写分离分布式情况下,这种方式并不适用,需要做调整。
解决方法
主键生成采用雪花算法,过程如下:
1.实现tk-mybaits的GenId
雪花算法工具类用的是hutool的,生成雪花id时,需要根据实际情况考虑雪花算法可能会出现相同id的情况 。
public class TkGenerateUUID implements GenId {
@Override
public Object genId(String s, String s1) {
Snowflake snowflake = IdUtil.createSnowflake(1, 1);
return snowflake.nextStr();
}
}
2.更改主键生成方式
@Id
@KeySql(genId = TkGenerateUUID.class)
private String id;