皮皮网

【扫描web源码】【素材cms源码】【app变成源码】datasourcebuilder源码

2024-11-23 03:10:23 来源:testrtspclient源码下载

1.Spring Boot2 系列教程(二十)整合JdbcTemplate 多数据源
2.APPLICATION FAILED TO START
3.Springboot之分布式事务框架Seata实现原理源码分析
4.SpringBoot整合多种类型数据源(mysql+pg)

datasourcebuilder源码

Spring Boot2 系列教程(二十)整合JdbcTemplate 多数据源

       多数据源配置在开发中常见,Spring 和 SpringBoot 提供解决方案,但复杂场景下推荐使用分布式数据库中间件 MyCat。某用户需求存储于四十多个不同数据库中时,建议通过 MyCat与sharding-by-intfile策略分表。若需求简单,扫描web源码多数据源配置在Spring Boot中亦可行,JdbcTemplate、MyBatis与Jpa均支持配置多数据源。

       首先创建工程,选择Web、Jdbc与MySQL驱动,确保手动添加Druid依赖,使用druid-spring-boot-starter以利用DruidDataSourceBuilder构建DataSource实例。素材cms源码在application.properties配置数据源,定义两个,通过one与two区分。手动配置DataSourceConfig,使用@ConfigurationProperties实现属性绑定,创建两个不同DataSource Bean,用于构建两个不同JdbcTemplate。

       接着创建JdbcTemplateConfig类,提供两个不同JdbcTemplate实例,每个实例对应一个DataSource。避免Spring容器默认查找冲突,使用@Qualifier注解指定名称查找。注入JdbcTemplate时,app变成源码可使用@Resource注解通过byName方式或@Autowired注解联合@Qualifier注解实现。验证使用,Controller中注入两个JdbcTemplate实例,分别操作不同数据源,实现多数据源配置。

       至此,多数据源配置流程完成。对于有需求的开发者,参考相关案例,通过实际操作实现多数据源管理。

APPLICATION FAILED TO START

       Description:

        Field financeLeaseApplyImgUpLoadMapper in com.yqjr.car.commercial.service.ApplyImgSecondService required a bean of type 'com.yqjr.car.commercial.mapper.gffldev.FinanceLeaseApplyImgUpLoadMapper' that could not be found.

       æ„æ€å¤§è‡´å°±æ˜¯åœ¨ApplyImgSecondService中找不到需要的financeLeaseApplyImgUpLoadMapper 。上网查到的意思也是项目无法找到financeLeaseApplyImgUpLoadMapper这个类。我想到的解决办法。

        1.先注释掉调用这个类的方法。发现还是报错

        但是报错文件换啦

        2.我在想这两个文件中的共同点

        3.被我发现这个两个类都是新添加的数据源

        添加文件 :

        1.@Configuration

        public class DataSourceConfig {

        @ConfigurationProperties(prefix ="spring.datasource.gfdev")

        @Bean

          public DataSourcegfdevDataSource() {

        return DataSourceBuilder.create().type(HikariDataSource.class).build();

          }

        @ConfigurationProperties(prefix ="spring.datasource.fldev")

        @Bean

          public DataSourcefldevDataSource() {

        return DataSourceBuilder.create().type(HikariDataSource.class).build();

          }

        @ConfigurationProperties(prefix ="spring.datasource.gffldev")

        @Bean

          public DataSourcegffldevDataSource() {

        return DataSourceBuilder.create().type(HikariDataSource.class).build();

          }

        }

       2.

        @MapperScan(basePackages ="com.yqjr.car.commercial.mapper.gffldev", sqlSessionTemplateRef ="gffldevSqlSessionTemplate")

        @Configuration

        public class GfFldevMybatisConfig {

        private static final LoggerLOGGER = LoggerFactory.getLogger(GfFldevMybatisConfig.class);

          @Bean

          public SqlSessionFactorygffldevSqlSessionFactory(@Qualifier("gffldevDataSource") DataSource dataSource)  {

        PathMatchingResourcePatternResolver pathMatchingResourcePatternResolver =new PathMatchingResourcePatternResolver();

              Resource[] resources =new Resource[0];

              try {

        resources = pathMatchingResourcePatternResolver.getResources("classpath:mapper/gffldev/**/*.xml");

              }catch (IOException e) {

        LOGGER.info(e.getMessage(),e);

              }

        SqlSessionFactoryBean sqlSessionFactoryBean =new SqlSessionFactoryBean();

              sqlSessionFactoryBean.setDataSource(dataSource);

              sqlSessionFactoryBean.setMapperLocations(resources);

              try {

        return sqlSessionFactoryBean.getObject();

              }catch (Exception e) {

        LOGGER.info(e.getMessage(),e);

        return null;

              }

        }

        @Bean

          public SqlSessionTemplategffldevSqlSessionTemplate(@Qualifier("gffldevSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {

        return new SqlSessionTemplate(sqlSessionFactory);

          }

Springboot之分布式事务框架Seata实现原理源码分析

       在SpringBoot环境下的分布式事务框架Seata实现原理涉及到了代理数据源、注册代理Bean以及全局事务拦截器等关键环节。下面我们将逐步解析其核心逻辑。话题论坛源码

       首先,Seata通过GlobalTransactionScanner来注册项目中所有带有@GlobalTransactional注解的方法类。该扫描器是一个实现了BeanPostProcessor接口的类,它能够在Spring容器初始化时进行后置处理,从而实现全局事务的管理。

       GlobalTransactionScanner实际上是一个InstantiationAwareBeanPostProcessor,它在实例化Bean前执行postProcessBeforeInstantiation方法,在实例化后执行postProcessAfterInstantiation方法,并在属性填充时执行postProcessProperties方法。尽管GlobalTransactionScanner类本身并未覆盖这3个方法,但在父类的实现中,这些方法用于处理Bean的实例化和属性设置过程。

       关键在于postProcessAfterInitialization方法中实现的跳远250源码wrapIfNecessary方法,该方法在GlobalTransactionScanner类中被重写。当方法执行到existsAnnotation方法判断类方法是否带有@GlobalTransactional注解时,如果存在则创建一个GlobalTransactionalInterceptor作为拦截器处理全局事务。

       在创建代理数据源时,Seata通过DataSourceProxy对系统默认数据源进行代理处理。通过shouldSkip方法判断当前bean是否需要被代理,如果bean是SeataProxy的子类且不是DataSource的子类且不在excludes集合中,则进行代理,从而代理当前系统的默认数据源对象。

       全局事务拦截器主要负责全局事务的发起、执行和回滚。在执行全局事务的方法被代理时,具体的执行拦截器是GlobalTransactionalInterceptor。该拦截器处理全局事务的逻辑,包括获取全局事务、开始全局事务、执行本地业务、提交本地事务、记录undo log、提交数据更新等步骤。其中,提交本地事务时会向TC(Transaction Coordinator)注册分支并提交本地事务,整个过程确保了分布式事务的一致性。

       当全局事务中任何一个分支发生异常时,事务将被回滚。参与全局事务的组件在异常发生时执行特定的回滚逻辑,确保事务一致性。在Seata的实现中,异常处理机制确保了事务的回滚能够正确执行。

       Seata还提供了XID(Transaction Identifier)的传递机制,通过RestTemplate和Feign客户端进行服务间的调用,确保分布式系统中各个服务能够共享和处理全局事务。RestTemplate在请求头中放置TX_XID头信息,而Feign客户端通过从调用链中获取Feign.Builder,最终通过SeataHystrixFeignBuilder.builder方法实现XID的传递。

       在被调用端(通过Feign调用服务),Seata自动配置会创建数据源代理,使得事务方法执行时能够获取到连接对象,而这些连接对象已经被代理成DataSourceProxy。SeataHandlerInterceptor拦截器对所有请求进行拦截,从Header中获取TX_XID,参与者的XID绑定到上下文中,通过ConnectionProxy获取代理连接对象。在数据库操作中,XID绑定到ConnectionContext,执行SQL语句时通过StatementProxy或PreparedStatementProxy代理连接,从而完成全局事务的处理。

       综上所述,Seata通过一系列复杂的逻辑和机制,实现了SpringBoot环境下的分布式事务管理,确保了分布式系统中数据的一致性和可靠性。

SpringBoot整合多种类型数据源(mysql+pg)

       在SpringBoot中整合多种类型数据源,例如MySQL和PostgreSQL(PG),可以实现数据库的灵活管理和高效处理。配置多数据源的基本思想是为每个数据源建立一个独立的连接池,以确保不同数据源之间的独立性和资源隔离。

       步骤一:引入依赖

       首先,需要在SpringBoot项目的pom.xml文件中引入相关数据源和连接池的依赖。例如,可以使用Druid连接池,通过添加以下依赖:

       xml

        com.alibaba

        druid

        latest-version

       步骤二:配置数据源

       在SpringBoot的application.properties或application.yml文件中配置多个数据源,示例如下:

       properties

       spring.datasource.mysql.type=com.alibaba.druid.pool.DruidDataSource

       spring.datasource.mysql.url=jdbc:mysql://localhost:/mydb

       spring.datasource.mysql.username=root

       spring.datasource.mysql.password=

       spring.datasource.mysql.driver-class-name=com.mysql.cj.jdbc.Driver

       spring.datasource.pg.type=com.alibaba.druid.pool.DruidDataSource

       spring.datasource.pg.url=jdbc:postgresql://localhost:/mydb

       spring.datasource.pg.username=postgres

       spring.datasource.pg.password=

       spring.datasource.pg.driver-class-name=org.postgresql.Driver

       步骤三:使用多数据源

       在SpringBoot的配置类中注入DataSource接口,根据需求选择使用MySQL或PG数据源。例如:

       java

       @Configuration

       public class DataSourceConfig {

        @Bean

        @ConfigurationProperties(prefix = "spring.datasource.mysql")

        public DataSource mysqlDataSource() {

        return DataSourceBuilder.create().build();

        }

        @Bean

        @ConfigurationProperties(prefix = "spring.datasource.pg")

        public DataSource pgDataSource() {

        return DataSourceBuilder.create().build();

        }

        @Bean

        public PlatformTransactionManager transactionManager(DataSource mysqlDataSource, DataSource pgDataSource) {

        return new DataSourceTransactionManager(mysqlDataSource);

        }

       }

       在需要使用数据源的Service或Controller类中注入相应的数据源,编写相应的业务逻辑。

       通过以上步骤,SpringBoot项目可以轻松实现MySQL和PG数据源的整合,提供更灵活、高效的数据访问与管理能力。这样的配置不仅有助于数据库资源的优化管理,还能满足跨数据库应用的需求,增强系统的扩展性和可靠性。