Java Springboot 多数据源配置(Springboo
2019-03-20 本文已影响174人
MicoCube
-
注意事项
关键点在于数据源配置,配置俩数据源,具体看DataSourceConfig,
配置各自的entityManager,事务管理器,各自的entity/repo 路径
具体查看PrimaryConfig和SecondaryConfig, -
关于事务
这个例子并不能做到跨库事务回滚,控制器/user/testTransaction
中在test库中添加了一个用户,在secondery库中添加了一个city,
之后触发一个异常,
但是当触发异常之后,实际上只有City表被回滚,
这个线程中其实始终只有一个事务管理器,当用户添加完毕之后,
test库的事务完成,线程进入secondery的事务管理器,异常触发后,
city表被回滚 -
关于@Primary注解
当一个接口有2个不同实现时,使用@Autowired注解时会报org.springframework.beans.factory.NoUniqueBeanDefinitionException异常信息- 方案1-@Qualifier
使用Qualifier注解,选择一个对象的名称,通常比较常用 - 方案2-@Primary
Primary可以理解为默认优先选择,同时不可以同时设置多个,内部实质是设置BeanDefinition的primary属性 - 示例
@Component("metalSinger") // 加注解,让spring识别 public class MetalSinger implements Singer{ @Override public String sing(String lyrics) { return "I am singing with DIO voice: "+lyrics; } } @Primary @Component("operaSinger") public class OperaSinger implements Singer { @Override public String sing(String lyrics) { return "I am singing in Bocelli voice: "+lyrics; } } public interface Singer { String sing(String lyrics); } @Component public class SingerService { private static final Logger logger = LoggerFactory.getLogger(SingerService.class); @Autowired @Qualifier private Singer singer; public String sing(){ return singer.sing("song lyrics"); } public static void main(String[] args) { ApplicationContext context = new AnnotationConfigApplicationContext("context.annotation.primary"); SingerService singerService = context.getBean(SingerService.class); System.out.println(singerService.sing()); } }
- 方案1-@Qualifier
-
修改数据库编码
- show create table ‘table’ 查看表结构发现 DEFAULT CHARSET=utf8
- 修改字段编码:alter table ‘table’ convert to character set utf8;
- 修改表的编码:ALTER TABLE ‘table’ DEFAULT CHARACTER SET utf8;