发布网友 发布时间:2022-04-24 04:52
共3个回答
懂视网 时间:2022-05-03 16:14
DateSource 定义注解 DateSourceContext 定义ThreadLocal上下文 DataSourceRouteAspect会拦截注解dataSource的方法,业务方法之前设置数据源,设置到ThreadLocal中 也可根据业务参数自主设置数据源,达到分库效果 DruidConfig 配置多数据源 MybatisConfig 扫描sql配置类 RouteDataSource 通过继承AbstractRoutingDataSource重写,获取ThreadLocal中的数据源 @Target({ ElementType.METHOD,ElementType.TYPE,ElementType.PARAMETER}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface DataSource { String value() default ""; } public class DataSourceContext { private static final ThreadLocal<String> context = new ThreadLocal<>(); public static void setDataSource(String value){ context.set(value); } public static String getDataSource(){ return context.get(); } public static void clearDataSource(){ context.remove(); } } @Aspect @Component public class DataSourceRouteAspect { @Before("@annotation(dataSource)") public void selectDateSource(JoinPoint point, DataSource dataSource){ String value = dataSource.value(); DataSourceContext.setDataSource(value); } @After("@annotation(dataSource)") public void removeDataSource(JoinPoint point, DataSource dataSource){ DataSourceContext.clearDataSource(); } } @Configuration public class DruidConfig { // @Value("${mysql.one.aliasName}") // private String aliasNameOne; // @Primary @Bean(name="dataSourceOne",initMethod = "init",destroyMethod = "close") @ConfigurationProperties(prefix = "mysql.one") public DruidDataSource dataSourceOne(){ DruidDataSource dataSource = new DruidDataSource(); dataSource.setQueryTimeout(300); dataSource.setTestWhileIdle(true); dataSource.setTestOnBorrow(true); dataSource.setTestOnReturn(true); dataSource.setTimeBetweenEvictionRunsMillis(600000); dataSource.setMinEvictableIdleTimeMillis(300000); return dataSource; } // @Bean(name="dataSourceTwo",initMethod = "init",destroyMethod = "close") // @ConfigurationProperties(prefix = "mysql.two") // public DruidDataSource dataSourceOne(){ // return dataSource; // } @Bean(name = "routeDataSource") public RouteDataSource dataSource(@Qualifier("dataSourceOne")DruidDataSource dataSourceOne // ,@Qualifier("dataSourceTwo")DruidDataSource dataSourceTwo ){ Map<Object, Object> targetDataSources = new HashMap<>(); targetDataSources.put("dataSourceOne",dataSourceOne); // targetDataSources.put("dataSourceTwo",dataSourceTwo); RouteDataSource dataSource = new RouteDataSource(); dataSource.setTargetDataSources(targetDataSources); dataSource.setDefaultTargetDataSource(dataSourceOne); System.out.println("routeDataSource******************"+dataSource); return dataSource; } } @Configuration public class DruidConfig { // @Value("${mysql.one.aliasName}") // private String aliasNameOne; // @Primary @Bean(name="dataSourceOne",initMethod = "init",destroyMethod = "close") @ConfigurationProperties(prefix = "mysql.one") public DruidDataSource dataSourceOne(){ DruidDataSource dataSource = new DruidDataSource(); dataSource.setQueryTimeout(300); dataSource.setTestWhileIdle(true); dataSource.setTestOnBorrow(true); dataSource.setTestOnReturn(true); dataSource.setTimeBetweenEvictionRunsMillis(600000); dataSource.setMinEvictableIdleTimeMillis(300000); return dataSource; } // @Bean(name="dataSourceTwo",initMethod = "init",destroyMethod = "close") // @ConfigurationProperties(prefix = "mysql.two") // public DruidDataSource dataSourceOne(){ // return dataSource; // } @Bean(name = "routeDataSource") public RouteDataSource dataSource(@Qualifier("dataSourceOne")DruidDataSource dataSourceOne // ,@Qualifier("dataSourceTwo")DruidDataSource dataSourceTwo ){ Map<Object, Object> targetDataSources = new HashMap<>(); targetDataSources.put("dataSourceOne",dataSourceOne); // targetDataSources.put("dataSourceTwo",dataSourceTwo); RouteDataSource dataSource = new RouteDataSource(); dataSource.setTargetDataSources(targetDataSources); dataSource.setDefaultTargetDataSource(dataSourceOne); System.out.println("routeDataSource******************"+dataSource); return dataSource; } } public class RouteDataSource extends AbstractRoutingDataSource { @Override protected Object determineCurrentLookupKey() { return DataSourceContext.getDataSource(); } } mapper配置类 import cn.com.config.dbConfig.DataSource; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Select; @Mapper public interface MyTestIbatis extends BaseMapper<String>{ @DataSource("dataSourceOne") @Select("select id from tbl_user") List<String> selectStr(); } import tk.mybatis.mapper.common.Mapper; public interface BaseMapper<T> extends Mapper<T> { } @Autowired MyTestIbatis myTestIbatis; myTestIbatis.selectStr()
springboot&数据库连接池&切面动态数据源
标签:aspect oid amp app auto cer table java nec
热心网友 时间:2022-05-03 13:22
Spring Boot 可以轻松创建的、生产级的基于 Spring 的应用程序,您可以“直接运行”这些应用程序。
我们对 Spring 平台和第三方库采取了固执的观点,因此您可以轻松上手。大多数 Spring Boot 应用程序需要最少的 Spring 配置。
特征
创建的 Spring 应用程序
直接嵌入Tomcat、Jetty或Undertow(无需部署WAR文件)
提供自以为是的“入门”依赖项以简化您的构建配置
尽可能自动配置 Spring 和 3rd 方库
提供生产就绪功能,例如指标、运行状况检查和外部化配置
完全不需要代码生成,也不需要 XML 配置
了解更多,可查询Spring中国教育管理中心相关信息
热心网友 时间:2022-05-03 14:40
当前互联网后端开发中,JavaEE占据了主导地位。对JavaEE开发,首选框架是Spring框架。在传统的Spring开发中,需要使用大量的与业务无关的XML配置才能使Spring框架运行起来,这点备受许多开发者诟病。为了进一步简化Spring应用的开发,SpringBoot诞生了。
其设计目的是为了进一步简化Spring应用的搭建及开发过程;
如今,在互联网公司中,对于后端开发工程师来说,SpringBoot已经一统江湖了,如果你不懂SpringBoot,可以说是落后与时代!如果你在做后端开发,而且对SpringBoot看的不是很明白,传智就业班视频中有详细解释,可以下载去学习。