背景:
做pii数据加密解密,要对代码无侵入,采用了shardingsphere的技术
改造方案:
在原来动态数据源的基础上引入shardingsphere数据源。动态数据源里之前有A,B两个数据源。将A,B两个数据源经过shardingsphere处理成pii数据源C,D。再放回动态数据源里
问题:
将数据源处理成shardingsphere数据源时,服务启动报错。错误信息:
Could not generate CGLIB subclass of class org.apache.shardingsphere.driver.jdbc.core.datasource.ShardingSphereDataSource
问题排查:
ShardingSphereDataSource是final修饰的,无法生成cglib对象导致报错,又不能禁掉cglib。否则mysql的事务会报错。所以问题原因定位在为啥会给ShardingSphereDataSource生成cglib对象
通过一步一步打断点,走spring加载bean的过程,发现是opentracting对jdbc进行了cglib增强。我们的链路追踪有用到opentracting的依赖,影响到了ShardingSphereDataSource。
解决方案:
在spring官网查询,发现可以单独禁用opentracting对jdbc的cglib增强。需要在在properties或yaml文件里加以下配置即可。不过最好在properties里加,yaml文件可能不生效:
opentracing.spring.cloud.jdbc.enabled=false
之后项目成功启动了,在要使用pii数据源的地方加动态数据源注解切换