最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

通過(guò)springboot+mybatis+druid配置動(dòng)態(tài)數(shù)據(jù)源

 更新時(shí)間:2019年06月24日 15:04:36   作者:夜月河色  
這篇文章主要介紹了通過(guò)springboot+mybatis+druid配置動(dòng)態(tài)數(shù)據(jù)源,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,,需要的朋友可以參考下

一、建數(shù)據(jù)庫(kù)和表
1.數(shù)據(jù)庫(kù)demo1放一張user表

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.數(shù)據(jù)庫(kù)demo2放一張role表

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');

二、pom.xml引入包

<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>

三、用generator插件生成user、role兩張表的實(shí)體類、mapper.java、mapper.xml

User.java
Role.java
UserMapper.java
RoleMapper.java
UserMapper.xml
RoleMapper.xml

四、配置application.yml

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
#驅(qū)動(dòng)包
driver-class-name: com.mysql.cj.jdbc.Driver
#初始連接數(shù)
initial-size: 5
#最小空閑數(shù)
min-idle: 5
#最大活動(dòng)數(shù)
max-active: 20
#等待超時(shí)時(shí)間
max-wait: 60000
#配置間隔多久才進(jìn)行一次檢測(cè),檢測(cè)需要關(guān)閉的空閑連接,單位是毫秒
time-between-eviction-runs-millis: 60000
# 配置一個(gè)連接在池中最小生存的時(shí)間,單位是毫秒
min-evictable-idle-time-millis: 300000
#驗(yàn)證數(shù)據(jù)庫(kù)連接的查詢語(yǔ)句,MYSQL是select 1
validation-query: SELECT 1 FROM DUAL
#空閑時(shí)測(cè)試,testOnBorrow和testOnReturn在生產(chǎn)環(huán)境一般是不開啟的,主要是性能考慮。失效連接主要通過(guò)testWhileIdle保證
test-while-idle: true
test-on-borrow: false
test-on-return: false
#打開PSCache,并指定每個(gè)鏈接上的PSCache大小
pool-prepared-statements: true
max-pool-prepared-statement-per-connection-size: 20
#配置監(jiān)控統(tǒng)計(jì)攔截的filters,去掉后監(jiān)控界面sql無(wú)法統(tǒng)計(jì),‘wall'用于防火墻,此處是filter修改的地方
filters: stat,wall
#通過(guò)connectproperties屬性來(lái)打開mergesql功能:慢sql記錄
connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
#合并多個(gè)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
#驅(qū)動(dòng)包
driver-class-name: com.mysql.cj.jdbc.Driver
#初始連接數(shù)
initial-size: 5
#最小空閑數(shù)
min-idle: 5
#最大活動(dòng)數(shù)
max-active: 20
#等待超時(shí)時(shí)間
max-wait: 60000
#配置間隔多久才進(jìn)行一次檢測(cè),檢測(cè)需要關(guān)閉的空閑連接,單位是毫秒
time-between-eviction-runs-millis: 60000
# 配置一個(gè)連接在池中最小生存的時(shí)間,單位是毫秒
min-evictable-idle-time-millis: 300000
#驗(yàn)證數(shù)據(jù)庫(kù)連接的查詢語(yǔ)句,MYSQL是select 1
validation-query: SELECT 1 FROM DUAL
#空閑時(shí)測(cè)試,testOnBorrow和testOnReturn在生產(chǎn)環(huán)境一般是不開啟的,主要是性能考慮。失效連接主要通過(guò)testWhileIdle保證
test-while-idle: true
test-on-borrow: false
test-on-return: false
#打開PSCache,并指定每個(gè)鏈接上的PSCache大小
pool-prepared-statements: true
max-pool-prepared-statement-per-connection-size: 20
#配置監(jiān)控統(tǒng)計(jì)攔截的filters,去掉后監(jiān)控界面sql無(wú)法統(tǒng)計(jì),‘wall'用于防火墻,此處是filter修改的地方
filters: stat,wall
#通過(guò)connectproperties屬性來(lái)打開mergesql功能:慢sql記錄
connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
#合并多個(gè)DruidDataSource
useGlobalDataSourceStat: true

五、啟動(dòng)類掃描mapper.java文件

@SpringBootApplication
@MapperScan("com.example.demo.dao")
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}

六、定義DataSourceConfig, 將application.yml中的配置導(dǎo)入DataSource中,并注入到bean

@Configuration
public class DataSourceConfig {
//從配置文件配置數(shù)據(jù)源
@Primary
@Bean(name="datasource1")
@ConfigurationProperties("spring.datasource.db1")
public DataSource dataSource1(){
return new DruidDataSource();
}
//從配置文件配置數(shù)據(jù)源
@Bean(name="datasource2")
@ConfigurationProperties("spring.datasource.db2")
public DataSource dataSource2(){
return new DruidDataSource();
}
//動(dòng)態(tài)數(shù)據(jù)源 進(jìn)行數(shù)據(jù)源切換
@Bean(name="dynamicDataSource")
public DataSource dynamicDataSource(){
DynamicDataSource dynamicDatasource=new DynamicDataSource();
//設(shè)置默認(rèn)數(shù)據(jù)源
dynamicDatasource.setDefaultTargetDataSource(dataSource1());
//配置多數(shù)據(jù)源
Map<Object,Object> dsMap=new HashMap<>();
dsMap.put("datasource1",dataSource1());
dsMap.put("datasource2",dataSource2());
//將多數(shù)據(jù)源放到數(shù)據(jù)源池中
dynamicDatasource.setTargetDataSources(dsMap);
return dynamicDatasource;
}
}

七、定義動(dòng)態(tài)數(shù)據(jù)源切換類DynamicDataSourceContextHolder

public class DynamicDataSourceContextHolder {
private static final ThreadLocal<String> contextHolder=new ThreadLocal<>();
//設(shè)置數(shù)據(jù)源名稱
public static void setDB(String dbType){
contextHolder.set(dbType);
}
//獲取數(shù)據(jù)源名稱
public static String getDB(){
return contextHolder.get();
}
//清除數(shù)據(jù)源名
public static void clearDB(){
contextHolder.remove();
}
}

八、定義獲取動(dòng)態(tài)數(shù)據(jù)源類DynamicDataSource

public class DynamicDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return DynamicDataSourceContextHolder.getDB();
}
}

九、定義mybatis配置類,將DynamicDataSource放入SqlSessionFactoryBean中

@EnableTransactionManagement
@Configuration
public class MyBatisConfig {
@Resource(name = "dynamicDataSource")
private DataSource dynamicDataSource;
@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dynamicDataSource);//將動(dòng)態(tài)數(shù)據(jù)源bean配置到sqlsessionfactory
sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml"));
return sqlSessionFactoryBean.getObject();
}
@Bean
public PlatformTransactionManager platformTransactionManager() {
return new DataSourceTransactionManager(dynamicDataSource);
}
}

十、定義用于切換數(shù)據(jù)源的注解TargetDataSource

@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface TargetDataSource {
String value() default "datasource1";
}

十一、定義切面DynamicDataSourceAspect,用于攔截注解,并執(zhí)行數(shù)據(jù)源切換功能

@Aspect
@Component
public class DynamicDataSourceAspect {
@Before("@annotation(targetDataSource)")
public void beforeSwitchDS(JoinPoint point,TargetDataSource targetDataSource){
DynamicDataSourceContextHolder.setDB(targetDataSource.value());
}
@After("@annotation(targetDataSource)")
public void afterSwitchDS(JoinPoint point,TargetDataSource targetDataSource){
DynamicDataSourceContextHolder.clearDB();
}
}

十二、測(cè)試類Test

@RestController
public class Test {
@Autowired
private RoleMapper roleMapper;
@Autowired
private UserMapper userMapper;
//未使用TargetDataSource注解,則使用默認(rèn)數(shù)據(jù)源,即datasource1
@RequestMapping("/ds1")
public String selectDataSource1(){
return userMapper.selectByPrimaryKey(1).toString();
}
//使用了注解,則數(shù)據(jù)源為注解中指定的datasource2
@RequestMapping("/ds2")
@TargetDataSource("datasource2")
public String selectDataSource2(){
return roleMapper.selectByPrimaryKey(1).toString();
}
}

測(cè)試

1.輸入

http://localhost:8088/ds1

返回

2.輸入

http://localhost:8088/ds2

返回

結(jié)論:兩次請(qǐng)求分別從不同的數(shù)據(jù)庫(kù)獲取到了數(shù)據(jù),多數(shù)據(jù)源配置成功!

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • javafx實(shí)現(xiàn)圖片3D翻轉(zhuǎn)效果方法實(shí)例

    javafx實(shí)現(xiàn)圖片3D翻轉(zhuǎn)效果方法實(shí)例

    程序?qū)崿F(xiàn)思路: 在javafx中Node對(duì)象有一個(gè)effect屬性,可以用于實(shí)現(xiàn)各種特效。PerspectiveTransform特效可以使Node對(duì)象實(shí)現(xiàn)透視變換。因此我們可以通過(guò)計(jì)算透視變換中每個(gè)點(diǎn)的位置來(lái)實(shí)現(xiàn)3D翻轉(zhuǎn)特效。
    2013-04-04
  • 使用spring stream發(fā)送消息代碼實(shí)例

    使用spring stream發(fā)送消息代碼實(shí)例

    這篇文章主要介紹了使用spring stream發(fā)送消息代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Java中如何檢查數(shù)組是否包含某整數(shù)

    Java中如何檢查數(shù)組是否包含某整數(shù)

    這篇文章主要介紹了在?Java?中檢查數(shù)組是否包含某整數(shù),在本文中,我們使用了幾個(gè)內(nèi)置的方法,如anyMatch()、contains()、binarySearch()等,我們將在給定的數(shù)組中找到一個(gè)值,結(jié)合示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • 使用Java動(dòng)態(tài)創(chuàng)建Flowable會(huì)簽?zāi)P偷氖纠a

    使用Java動(dòng)態(tài)創(chuàng)建Flowable會(huì)簽?zāi)P偷氖纠a

    動(dòng)態(tài)創(chuàng)建流程模型,尤其是會(huì)簽(Parallel Gateway)模型,是提升系統(tǒng)靈活性和響應(yīng)速度的關(guān)鍵技術(shù)之一,本文將通過(guò)Java編程語(yǔ)言,深入探討如何在運(yùn)行時(shí)動(dòng)態(tài)地創(chuàng)建包含會(huì)簽環(huán)節(jié)的Flowable流程模型,需要的朋友可以參考下
    2024-05-05
  • 使用mybatis log plugin插件展示出數(shù)據(jù)庫(kù)查詢語(yǔ)句方式

    使用mybatis log plugin插件展示出數(shù)據(jù)庫(kù)查詢語(yǔ)句方式

    本文介紹了如何安裝和配置MyBatis日志插件,包括集成log4j、配置log4j.xml文件和在application.properties中添加數(shù)據(jù)庫(kù)打印配置,通過(guò)這些步驟,可以在調(diào)試時(shí)查看預(yù)編譯的數(shù)據(jù)庫(kù)語(yǔ)句和實(shí)際查詢語(yǔ)句
    2024-11-11
  • Java中的BigDecimal精度運(yùn)算詳解

    Java中的BigDecimal精度運(yùn)算詳解

    這篇文章主要介紹了Java中的BigDecimal精度運(yùn)算詳解,Java在java.math包中提供的API類BigDecimal,用來(lái)對(duì)超過(guò)16位有效位的數(shù)進(jìn)行精確的運(yùn)算,雙精度浮點(diǎn)型變量double可以處理16位有效數(shù),但在實(shí)際應(yīng)用中,可能需要對(duì)更大或者更小的數(shù)進(jìn)行運(yùn)算和處理,需要的朋友可以參考下
    2023-10-10
  • Netty結(jié)合Protobuf進(jìn)行編解碼的方法

    Netty結(jié)合Protobuf進(jìn)行編解碼的方法

    這篇文章主要介紹了Netty結(jié)合Protobuf進(jìn)行編解碼,通過(guò)文檔表述和代碼實(shí)例充分說(shuō)明了如何進(jìn)行使用和操作,需要的朋友可以參考下
    2021-06-06
  • java實(shí)現(xiàn)動(dòng)態(tài)數(shù)組

    java實(shí)現(xiàn)動(dòng)態(tài)數(shù)組

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)動(dòng)態(tài)數(shù)組,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • 解決nacos修改配置信息后需要重啟服務(wù)才能生效的問(wèn)題

    解決nacos修改配置信息后需要重啟服務(wù)才能生效的問(wèn)題

    當(dāng)配置信息發(fā)生變動(dòng)時(shí),傳統(tǒng)修改配置信息后,需要重新重啟服務(wù)器才可以生效,大量應(yīng)用配置修改時(shí),需要一個(gè)個(gè)修改配置,無(wú)法統(tǒng)一修改,且沒(méi)有辦法回溯配置版本,所以本文給大家介紹了如何解決這些問(wèn)題的方法,需要的朋友可以參考下
    2023-10-10
  • 詳解Eclipse 字體、字號(hào)的設(shè)置、最佳字體推薦

    詳解Eclipse 字體、字號(hào)的設(shè)置、最佳字體推薦

    這篇文章主要介紹了Eclipse 字體、字號(hào)的設(shè)置、最佳字體推薦,需要的朋友可以參考下
    2020-09-09

最新評(píng)論

鄂尔多斯市| 全椒县| 互助| 轮台县| 东光县| 偏关县| 惠水县| 平遥县| 肥东县| 雷波县| 舒城县| 准格尔旗| 澄江县| 维西| 海林市| 资溪县| 鹤峰县| 南昌县| 荆州市| 灵川县| 佛冈县| 鄂伦春自治旗| 灵寿县| 万州区| 罗定市| 扎赉特旗| 高雄市| 岳阳市| 右玉县| 泸水县| 蒙城县| 瑞金市| 荥阳市| 鲜城| 历史| 镇康县| 苏尼特左旗| 井研县| 谢通门县| 大宁县| 平泉县|