数据库分源 实现操作两个不同数据库(分包实现)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了数据库分源 实现操作两个不同数据库(分包实现),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5322字,纯文字阅读大概需要8分钟。
内容图文
![数据库分源 实现操作两个不同数据库(分包实现)](/upload/InfoBanner/zyjiaocheng/863/3b33bc5c6f204fdf9d241aa97a00a12b.jpg)
1.需求
项目启动时候读取两个不同的数据库数据源 不仅要读取A数据库进行操作还要读取B数据库进行操作,一般项目都是注册一个数据源, 解决方案有两种
- 分包方式
- AOP
介绍下分包的方式实现多数据源 mapper
2.首先了解下自定义 MyBatis 数据源创建过程 使用的druid数据库连接池
主要操作这三个对象
- DataSource
- SqlSessionFactoryBean
- SqlSessionTemplate
流程
//数据库连接信息读取类
DataSource
//SqlSessionFactoryBean实现了Spring 的 FactoryBean接口,bean 不是 SqlSessionFactoryBean 本身,而是工厂类的 getObject()返回的方法的结果
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
//SqlSessionFactoryBean必需要一个属性就是DataSource
factoryBean.setDataSource(dataSource);
//mapperLocations 属性使用一个资源位置。这个属性可以用来指定 MyBatis 的 XML 映射器文件的位置。
factoryBean.setMapperLocations()
SqlSessionFactory sessionFactory = factoryBean.getObject();
//在SqlSessionTemplate中,sqlSessionFacatory实际上的实现是“DefaultSqlSessionFacatory”。sessionFactory会创建事务、Executor,最终生成一个新的DefualtSqlSession对象。
// 使用配置的Factory
SqlSessionTemplate template = new SqlSessionTemplate(sqlSessionFactory);
//4.自定义 mapper扫描 实现类的接口所在的包,然后包下面的所有接口在编译之后都会生成相应的实现类
@MapperScan(basePackages = {"com.*.service.*.mapper"}, sqlSessionTemplateRef = "sqlSessionTemplate")
public class MyBatisConfig {}
详细代码
@Configuration
@MapperScan(basePackages = {"com.*.service.*.mapper"}, sqlSessionTemplateRef = "sqlSessionTemplate")
public class MyBatisConfig {
//读取配置文件类
@Bean(name = "jmDataSource")
@Primary
@ConfigurationProperties(prefix = "spring.datasource.master")
public DataSource getJmDataSource() {
return DataSourceBuilder.create().build();
}
//创建一个SqlSessionFactory bean
@Bean(name = "masterSqlSessionFactory")
public SqlSessionFactory sqlSessionFactory(@Qualifier("masterDataSource") DataSource dataSource) throws Exception{
//创建一个SqlSessionFactoryBean对象 设置属性
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
//dataSource 配置类属性
bean.setDataSource(dataSource);
//mapperLocations 资源位置属性
bean.setMapperLocations(
new PathMatchingResourcePatternResolver().getResources("classpath*:mapping/mapper/*.xml")
);
//工厂类的 getObject()返回的方法的结果
return bean.getObject();
}
//创建一个sqlSessionTemplate
@Bean("sqlSessionTemplate")
public SqlSessionTemplate sqlSessionTemplate( @Qualifier("masterSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
// 使用上面配置的Factory
SqlSessionTemplate template = new SqlSessionTemplate(sqlSessionFactory);
return template;
}
}
//DataSource 配置类
@Configuration
public class DruidProperties
{
@Value("${spring.datasource.master.druid.initialSize}")
private int initialSize;
@Value("${spring.datasource.master.druid.minIdle}")
private int minIdle;
@Value("${spring.datasource.master.druid.maxActive}")
private int maxActive;
@Value("${spring.datasource.master.druid.maxWait}")
private int maxWait;
@Value("${spring.datasource.master.druid.timeBetweenEvictionRunsMillis}")
private int timeBetweenEvictionRunsMillis;
@Value("${spring.datasource.master.druid.minEvictableIdleTimeMillis}")
private int minEvictableIdleTimeMillis;
@Value("${spring.datasource.master.druid.maxEvictableIdleTimeMillis}")
private int maxEvictableIdleTimeMillis;
@Value("${spring.datasource.master.druid.validationQuery}")
private String validationQuery;
@Value("${spring.datasource.master.druid.testWhileIdle}")
private boolean testWhileIdle;
@Value("${spring.datasource.master.druid.testOnBorrow}")
private boolean testOnBorrow;
@Value("${spring.datasource.master.druid.testOnReturn}")
private boolean testOnReturn;
public DruidDataSource dataSource(DruidDataSource datasource)
{
/** 配置初始化大小、最小、最大 */
datasource.setInitialSize(initialSize);
datasource.setMaxActive(maxActive);
datasource.setMinIdle(minIdle);
/** 配置获取连接等待超时的时间 */
datasource.setMaxWait(maxWait);
/** 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 */
datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
/** 配置一个连接在池中最小、最大生存的时间,单位是毫秒 */
datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
datasource.setMaxEvictableIdleTimeMillis(maxEvictableIdleTimeMillis);
/**
* 用来检测连接是否有效的sql,要求是一个查询语句,常用select 'x'。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会起作用。
*/
datasource.setValidationQuery(validationQuery);
/** 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。 */
datasource.setTestWhileIdle(testWhileIdle);
/** 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 */
datasource.setTestOnBorrow(testOnBorrow);
/** 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 */
datasource.setTestOnReturn(testOnReturn);
return datasource;
}
}
主要就是 MapperScan注解扫描包 指定包位置,会扫描包底下mapper文件并创建代理对象
@Configuration
@MapperScan(basePackages = {"com..service..mapper"}, sqlSessionTemplateRef = "sqlSessionTemplate")
然后配置 DataSource 配置类 两个数据源就创建两个配置 bean并指定相应的mapper文件地址
@Bean(name = "jmDataSource")
@Primary
@ConfigurationProperties(prefix = "spring.datasource.master")
public DataSource getJmDataSource() {
return DataSourceBuilder.create().build();
}
这是读取配置文件 不同的数据库读取不同的地址
内容总结
以上是互联网集市为您收集整理的数据库分源 实现操作两个不同数据库(分包实现)全部内容,希望文章能够帮你解决数据库分源 实现操作两个不同数据库(分包实现)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。