1. 데이터베이스 및 테이블 생성
1. 데이터베이스 데모1은 사용자 테이블을 넣습니다
SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for user -- ---------------------------- DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` int(11) NOT NULL, `name` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of user -- ---------------------------- INSERT INTO `user` VALUES ('1', 'aa'); INSERT INTO `user` VALUES ('2', 'bb');
2. 데이터베이스 데모2는 역할 테이블을 넣습니다
SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for role -- ---------------------------- DROP TABLE IF EXISTS `role`; CREATE TABLE `role` ( `id` int(11) NOT NULL, `name` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of role -- ---------------------------- INSERT INTO `role` VALUES ('1', 'CC'); INSERT INTO `role` VALUES ('2', 'DD');
2.
3 생성기 플러그인을 사용하여 사용자 및 역할 테이블의 mapper.java, mapper.xml을 생성합니다. 클래스 스캐닝 mapper.java 파일
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-web</artifactid>
</dependency>
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-test</artifactid>
<scope>test</scope>
</dependency>
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-thymeleaf</artifactid>
</dependency>
<dependency>
<groupid>mysql</groupid>
<artifactid>mysql-connector-java</artifactid>
<scope>runtime</scope>
</dependency>
<dependency>
<groupid>mysql</groupid>
<artifactid>mysql-connector-java</artifactid>
</dependency>
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-jdbc</artifactid>
</dependency>
<dependency>
<groupid>org.mybatis.spring.boot</groupid>
<artifactid>mybatis-spring-boot-starter</artifactid>
<version>2.0.1</version>
</dependency>
<!-- aop -->
<dependency>
<groupid>org.aspectj</groupid>
<artifactid>aspectjweaver</artifactid>
</dependency>
<!-- alibaba druid-->
<dependency>
<groupid>com.alibaba</groupid>
<artifactid>druid-spring-boot-starter</artifactid>
<version>1.1.10</version>
</dependency>
<!-- dynamic-->
<dependency>
<groupid>com.typesafe.dynamicdatasource</groupid>
<artifactid>dynamic-data-source_2.11</artifactid>
</dependency>
6. DataSourceConfig를 정의하고 application.yml의 구성을 DataSource로 가져온 다음 이를 Bean에 삽입합니다.
User.java
Role.java
UserMapper.java
RoleMapper.java
UserMapper.xml
RoleMapper.xml
7. 동적 데이터 소스 전환 클래스 DynamicDataSourceContextHolder 정의
server:
port: 8088
mybatis:
mapper-locations: classpath:mapper/*.xml
spring:
datasource:
db1:
url: jdbc:mysql://localhost:3306/demo1?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT
username: root
password: root
type: com.alibaba.druid.pool.DruidDataSource
#驱动包
driver-class-name: com.mysql.cj.jdbc.Driver
#初始连接数
initial-size: 5
#最小空闲数
min-idle: 5
#最大活动数
max-active: 20
#等待超时时间
max-wait: 60000
#配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
time-between-eviction-runs-millis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
min-evictable-idle-time-millis: 300000
#验证数据库连接的查询语句,MYSQL是select 1
validation-query: SELECT 1 FROM DUAL
#空闲时测试,testOnBorrow和testOnReturn在生产环境一般是不开启的,主要是性能考虑。失效连接主要通过testWhileIdle保证
test-while-idle: true
test-on-borrow: false
test-on-return: false
#打开PSCache,并指定每个链接上的PSCache大小
pool-prepared-statements: true
max-pool-prepared-statement-per-connection-size: 20
#配置监控统计拦截的filters,去掉后监控界面sql无法统计,‘wall'用于防火墙,此处是filter修改的地方
filters: stat,wall
#通过connectproperties属性来打开mergesql功能:慢sql记录
connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
#合并多个DruidDataSource
useGlobalDataSourceStat: true
db2:
url: jdbc:mysql://localhost:3306/demo2?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT
username: root
password: root
type: com.alibaba.druid.pool.DruidDataSource
#驱动包
driver-class-name: com.mysql.cj.jdbc.Driver
#初始连接数
initial-size: 5
#最小空闲数
min-idle: 5
#最大活动数
max-active: 20
#等待超时时间
max-wait: 60000
#配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
time-between-eviction-runs-millis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
min-evictable-idle-time-millis: 300000
#验证数据库连接的查询语句,MYSQL是select 1
validation-query: SELECT 1 FROM DUAL
#空闲时测试,testOnBorrow和testOnReturn在生产环境一般是不开启的,主要是性能考虑。失效连接主要通过testWhileIdle保证
test-while-idle: true
test-on-borrow: false
test-on-return: false
#打开PSCache,并指定每个链接上的PSCache大小
pool-prepared-statements: true
max-pool-prepared-statement-per-connection-size: 20
#配置监控统计拦截的filters,去掉后监控界面sql无法统计,‘wall'用于防火墙,此处是filter修改的地方
filters: stat,wall
#通过connectproperties属性来打开mergesql功能:慢sql记录
connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
#合并多个DruidDataSource
useGlobalDataSourceStat: true
8. 동적 데이터 소스 클래스 DynamicDataSource 정의
@SpringBootApplication
@MapperScan("com.example.demo.dao")
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
9. mybatis 구성 클래스를 정의하고 DynamicDataSource를 SqlSessionFactoryBean에 넣습니다
@Configuration
public class DataSourceConfig {
//从配置文件配置数据源
@Primary
@Bean(name="datasource1")
@ConfigurationProperties("spring.datasource.db1")
public DataSource dataSource1(){
return new DruidDataSource();
}
//从配置文件配置数据源
@Bean(name="datasource2")
@ConfigurationProperties("spring.datasource.db2")
public DataSource dataSource2(){
return new DruidDataSource();
}
//动态数据源 进行数据源切换
@Bean(name="dynamicDataSource")
public DataSource dynamicDataSource(){
DynamicDataSource dynamicDatasource=new DynamicDataSource();
//设置默认数据源
dynamicDatasource.setDefaultTargetDataSource(dataSource1());
//配置多数据源
Map<object> dsMap=new HashMap();
dsMap.put("datasource1",dataSource1());
dsMap.put("datasource2",dataSource2());
//将多数据源放到数据源池中
dynamicDatasource.setTargetDataSources(dsMap);
return dynamicDatasource;
}
}</object>
10. 데이터 소스 전환을 위한 TargetDataSource 주석 정의
public class DynamicDataSourceContextHolder {
private static final ThreadLocal<string> contextHolder=new ThreadLocal();
//设置数据源名称
public static void setDB(String dbType){
contextHolder.set(dbType);
}
//获取数据源名称
public static String getDB(){
return contextHolder.get();
}
//清除数据源名
public static void clearDB(){
contextHolder.remove();
}
}</string>
11. 주석을 가로채고 데이터 소스 전환 기능을 수행하는 데 사용되는 DynamicDataSourceAspect 측면을 정의합니다.
public class DynamicDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return DynamicDataSourceContextHolder.getDB();
}
}
12. 테스트 클래스 Test
@EnableTransactionManagement
@Configuration
public class MyBatisConfig {
@Resource(name = "dynamicDataSource")
private DataSource dynamicDataSource;
@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dynamicDataSource);//将动态数据源bean配置到sqlsessionfactory
sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml"));
return sqlSessionFactoryBean.getObject();
}
@Bean
public PlatformTransactionManager platformTransactionManager() {
return new DataSourceTransactionManager(dynamicDataSource);
}
}
Test
1. 입력
http://localhost:8088/ds1
↓
2. http://localhost:8088/ds2
를 입력하세요.
반품http://localhost:8088/ds1
返回
↓
2.输入
http://localhost:8088/ds2
↓
위 내용은 mybatis+druid를 사용하여 springboot에서 동적 데이터 소스를 구성하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!