1.Spring Boot2 系列教程(二十)整合JdbcTemplate 多数据源
2.APPLICATION FAILED TO START
3.Springboot之分布式事务框架Seata实现原理源码分析
4.SpringBoot整合多种类型数据源(mysql+pg)
Spring Boot2 系列教程(二十)整合JdbcTemplate 多数据源
多数据源配置在开发中常见,Spring 和 SpringBoot 提供解决方案,但复杂场景下推荐使用分布式数据库中间件 MyCat。某用户需求存储于四十多个不同数据库中时,建议通过 MyCat与sharding-by-intfile策略分表。若需求简单,AI矩阵系统源码多数据源配置在Spring Boot中亦可行,JdbcTemplate、MyBatis与Jpa均支持配置多数据源。
首先创建工程,选择Web、Jdbc与MySQL驱动,确保手动添加Druid依赖,使用druid-spring-boot-starter以利用DruidDataSourceBuilder构建DataSource实例。膏药网站源码在application.properties配置数据源,定义两个,通过one与two区分。手动配置DataSourceConfig,使用@ConfigurationProperties实现属性绑定,创建两个不同DataSource Bean,用于构建两个不同JdbcTemplate。
接着创建JdbcTemplateConfig类,提供两个不同JdbcTemplate实例,每个实例对应一个DataSource。避免Spring容器默认查找冲突,使用@Qualifier注解指定名称查找。注入JdbcTemplate时,博客前端源码可使用@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方法中实现的减肥产品源码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数据源的整合,提供更灵活、高效的数据访问与管理能力。这样的配置不仅有助于数据库资源的优化管理,还能满足跨数据库应用的需求,增强系统的扩展性和可靠性。