国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

yml配置動態(tài)數(shù)據(jù)源(數(shù)據(jù)庫@DS)與引起(If you want an embedded database (H2, HSQL or Derby))類問題

這篇具有很好參考價值的文章主要介紹了yml配置動態(tài)數(shù)據(jù)源(數(shù)據(jù)庫@DS)與引起(If you want an embedded database (H2, HSQL or Derby))類問題。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

1:yml 配置

spring:
  datasource:
    dynamic:
      datasource:
        master:
          url: jdbc:mysql://192.168.11.50:3306/dsdd?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
          username: root
          password: root
          driver-class-name: com.mysql.cj.jdbc.Driver
        second-datasource:
          url: jdbc:mysql://192.168.11.50:3306/commons_utils?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
          username: root
          password: root
          driver-class-name: com.mysql.cj.jdbc.Driver

2:必須pom依賴配

        <!-- 動態(tài)數(shù)據(jù)源 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
            <version>3.2.0</version>
        </dependency>

2-1:不要加入一下依賴不然會報以下錯誤

        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>1.4.200</version>
            <scope>runtime</scope>
        </dependency>

        <!-- druid -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.6</version>
        </dependency>

yml配置動態(tài)數(shù)據(jù)源(數(shù)據(jù)庫@DS)與引起(If you want an embedded database (H2, HSQL or Derby))類問題,數(shù)據(jù)庫

2-2:當出現(xiàn)以上錯誤可以在yml配置文件去掉DruidDataSourceAutoConfigure,如下

spring:
  autoconfigure:
    exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure

3:加入數(shù)據(jù)庫連接池druid依賴管理(使用多數(shù)據(jù)源一定要用鏈接池),Druid是阿里巴巴開源的一個數(shù)據(jù)庫連接池和實時數(shù)據(jù)分析組件。相比其他連接池,Druid在功能特性、性能、監(jiān)控等方面有很多優(yōu)勢,比如支持SQL解析、慢SQL日志、提供多維度監(jiān)控等

spring:
  autoconfigure:
    exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
  datasource:
    druid:
      stat-view-servlet:
        enabled: true
        loginUsername: admin
        loginPassword: 123456
        allow:
      web-stat-filter:
        enabled: true
    dynamic:
      druid: # 全局druid參數(shù),絕大部分值和默認保持一致。(現(xiàn)已支持的參數(shù)如下,不清楚含義不要亂設(shè)置)
        # 連接池的配置信息
        # 初始化大小,最小,最大
        initial-size: 5
        min-idle: 5
        maxActive: 20
        # 配置獲取連接等待超時的時間r
        maxWait: 60000
        # 配置間隔多久才進行一次檢測,檢測需要關(guān)閉的空閑連接,單位是毫秒
        timeBetweenEvictionRunsMillis: 60000
        # 配置一個連接在池中最小生存的時間,單位是毫秒
        minEvictableIdleTimeMillis: 300000
        validationQuery: SELECT 1 FROM DUAL
        testWhileIdle: true
        testOnBorrow: false
        testOnReturn: false
        # 打開PSCache,并且指定每個連接上PSCache的大小
        poolPreparedStatements: true
        maxPoolPreparedStatementPerConnectionSize: 20
        # 配置監(jiān)控統(tǒng)計攔截的filters,去掉后監(jiān)控界面sql無法統(tǒng)計,'wall'用于防火墻
        filters: stat,wall,slf4j
        # 通過connectProperties屬性來打開mergeSql功能;慢SQL記錄
        connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
      datasource:
        master:
          url: jdbc:mysql://192.168.11.50:3306/dsdd?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
          username: root
          password: root
          driver-class-name: com.mysql.cj.jdbc.Driver
        second:
          url: jdbc:mysql://192.168.11.50:3306/commons_utils?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
          username: root
          password: root
          driver-class-name: com.mysql.cj.jdbc.Driver

3-1:加入依賴

        <!-- 動態(tài)數(shù)據(jù)源 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
            <version>3.2.0</version>
        </dependency>

        <!-- druid -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.6</version>
        </dependency>

Druid連接池的自動配置類是DruidDataSourceAutoConfigure類上有一行注解

@EnableConfigurationProperties({DruidStatProperties.class, DataSourceProperties.class})

@EnableConfigurationProperties注解的作用是:使配置文件中的配置生效并且映射到指定類的屬性

DruidStatProperties:指定的前綴是spring.datasource.druid,主要設(shè)置連接池的一些參數(shù)

DataSourceProperties:指定的前綴是spring.datasource,主要設(shè)置url,username,password等信息

3-2:DruidConfig 配置類

package com.example.poi.config;

import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure;
import com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties;
import com.alibaba.druid.util.Utils;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.servlet.*;
import java.io.IOException;

/**
 * @Description: DruidConfig配置類
 */
@Configuration
@AutoConfigureAfter(DruidDataSourceAutoConfigure.class)
public class DruidConfig {

    /**
     * 帶有廣告的common.js全路徑,druid-1.1.14
     */
    private static final String FILE_PATH = "support/http/resources/js/common.js";
    /**
     * 原始腳本,觸發(fā)構(gòu)建廣告的語句
     */
    private static final String ORIGIN_JS = "this.buildFooter();";
    /**
     * 替換后的腳本
     */
    private static final String NEW_JS = "http://this.buildFooter();";

    /**
     * 去除Druid監(jiān)控頁面的廣告
     *
     * @param properties DruidStatProperties屬性集合
     * @return {@link FilterRegistrationBean}
     */
    @Bean
    @ConditionalOnWebApplication
    @ConditionalOnProperty(name = "spring.datasource.druid.stat-view-servlet.enabled", havingValue = "true")
    public FilterRegistrationBean<RemoveAdFilter> removeDruidAdFilter(
            DruidStatProperties properties) throws IOException {
        // 獲取web監(jiān)控頁面的參數(shù)
        DruidStatProperties.StatViewServlet config = properties.getStatViewServlet();
        // 提取common.js的配置路徑
        String pattern = config.getUrlPattern() != null ? config.getUrlPattern() : "/druid/*";
        String commonJsPattern = pattern.replaceAll("\\*", "js/common.js");
        // 獲取common.js
        String text = Utils.readFromResource(FILE_PATH);
        // 屏蔽 this.buildFooter(); 不構(gòu)建廣告
        final String newJs = text.replace(ORIGIN_JS, NEW_JS);
        FilterRegistrationBean<RemoveAdFilter> registration = new FilterRegistrationBean<>();
        registration.setFilter(new RemoveAdFilter(newJs));
        registration.addUrlPatterns(commonJsPattern);
        return registration;
    }

    /**
     * 刪除druid的廣告過濾器
     *
     * @author BBF
     */
    private class RemoveAdFilter implements Filter {

        private final String newJs;

        public RemoveAdFilter(String newJs) {
            this.newJs = newJs;
        }

        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                throws IOException, ServletException {
            chain.doFilter(request, response);
            // 重置緩沖區(qū),響應頭不會被重置
            response.resetBuffer();
            response.getWriter().write(newJs);
        }
    }
}

4:配置動態(tài)數(shù)據(jù)源方法二,yml隨意配置或者通過配置類生成數(shù)據(jù)庫鏈接

4-1:yml配置(記得配置數(shù)據(jù)庫鏈接池)

datasource:
  master:
    url: jdbc:mysql://192.168.11.50:3306/dsdd?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver
  second:
    url: jdbc:mysql://192.168.11.50:3306/commons_utils?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver

4-2:配置動態(tài)源數(shù)據(jù)類

@Configuration
public class DatabaseConfig {

    @Value("${datasource.master.url}")
    private String dataSourceUrl;

    @Value("${datasource.master.username}")
    private String dataSourceUsername;

    @Value("${datasource.master.password}")
    private String dataSourcePassword;

    @Value("${datasource.master.driver-class-name}")
    private String dataSourceDriverClassName;

    @Value("${datasource.second.url}")
    private String dataSourceUrl2;

    @Value("${datasource.second.username}")
    private String dataSourceUsername2;

    @Value("${datasource.second.password}")
    private String dataSourcePassword2;

    @Value("${datasource.second.driver-class-name}")
    private String dataSourceDriverClassName2;

    public DataSource dataSource() {
        return  DataSourceBuilder.create()
                .url(dataSourceUrl)
                .username(dataSourceUsername)
                .password(dataSourcePassword)
                .driverClassName("com.mysql.cj.jdbc.Driver")
                .build();
    }
    public DataSource dataSource2() {
        return DataSourceBuilder.create()
                .url(dataSourceUrl2)
                .username(dataSourceUsername2)
                .password(dataSourcePassword2)
                .driverClassName("com.mysql.cj.jdbc.Driver")
                .build();
    }

    // 添加動態(tài)數(shù)據(jù)源
    @Bean
    public DynamicRoutingDataSource dynamicDataSource() {
        DynamicRoutingDataSource dynamicRoutingDataSource = new DynamicRoutingDataSource();
        dynamicRoutingDataSource.addDataSource("master", dataSource());
        dynamicRoutingDataSource.addDataSource("two", dataSource2());
        return dynamicRoutingDataSource;
    }
}

4-3:在server服務層通過@DS調(diào)用

    @Override
    @DS("two")
    public List<EntityDemo> testSql(Page<EntityDemo> pageList, String id)  {
        List<EntityDemo> entityDemos = entityDemoMapper.testSql(pageList, id);
        DynamicDataSourceContextHolder.clear();
        return entityDemos;

4-4:可以在啟動類觀察動態(tài)數(shù)據(jù)源情況如下:run.getBean(DataSource.class).getConnection();

@SpringBootApplication
@MapperScan(basePackages = "com.example.poi.mapper")
public class PoiApplication {
    public static void main(String[] args) {
        ConfigurableApplicationContext run = SpringApplication.run(PoiApplication.class, args);
        // 檢查數(shù)據(jù)庫連接是否正常
        try {
            // 獲取DataSource bean,并調(diào)用getConnection()方法測試連接
            run.getBean(javax.sql.DataSource.class).getConnection();
            System.out.println("數(shù)據(jù)庫連接正常!");
        } catch (Exception e) {
            System.err.println("數(shù)據(jù)庫連接異常:" + e.getMessage());
            // 處理連接異常的邏輯
        }
    }
}

yml配置動態(tài)數(shù)據(jù)源(數(shù)據(jù)庫@DS)與引起(If you want an embedded database (H2, HSQL or Derby))類問題,數(shù)據(jù)庫

5:方法三配置動態(tài)數(shù)據(jù)源使,使用注解的方式(推薦使用)

5-1:yml配置

spring:
  datasource:
    master:
      jdbcUrl: jdbc:mysql://192.168.11.50:3306/dsdd?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
      username: root
      password: root
      driver-class-name: com.mysql.cj.jdbc.Driver
    second:
      jdbcUrl: jdbc:mysql://192.168.11.50:3306/commons_utils?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
      username: root
      password: root
      driverClassName: com.mysql.cj.jdbc.Driver
    druid:
      #連接池初始化時創(chuàng)建的數(shù)據(jù)庫連接數(shù)量
      initial-size: 10
      #連接池中保持最小的空閑連接數(shù)量。如果空閑連接數(shù)量少于這個值,連接池會創(chuàng)建新的連接來補充
      min-idle: 5
      #
      max-active: 80
      #配置獲取鏈接等待超時的時間
      max-wait:
    type: com.alibaba.druid.pool.DruidDataSource

5-2:配置動態(tài)源數(shù)據(jù)類(在需要切換的地方使用@DS就可以),整合mybatis-plus的過程中,我們還需要創(chuàng)建動態(tài)數(shù)據(jù)源的SqlSessionFactory,如果我們想要實現(xiàn)動態(tài)數(shù)據(jù)源切換,則需要手動配置SqlSessionFactory,以便于它使用動態(tài)數(shù)據(jù)源,同理事務管理器也需要重新配置:

@Configuration
public class DatabaseConfig {


    @Bean("one")
    @ConfigurationProperties(prefix = "spring.datasource.master")
    public DataSource dataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean("two")
    @ConfigurationProperties(prefix = "spring.datasource.second")
    public DataSource dataSource2() {
        return DataSourceBuilder.create().build();
    }

    //添加動態(tài)數(shù)據(jù)源
    @Bean
    public DynamicRoutingDataSource dynamicDataSource(@Qualifier("one") DataSource dataSource, @Qualifier("two") DataSource dataSource2) {
        DynamicRoutingDataSource dynamicRoutingDataSource = new DynamicRoutingDataSource();
        dynamicRoutingDataSource.addDataSource("master", dataSource);
        dynamicRoutingDataSource.addDataSource("two", dataSource2);
        return dynamicRoutingDataSource;
    }


    @Bean("sqlSessionFactory")
    public SqlSessionFactory sqlSessionFactoryBean(DynamicRoutingDataSource dynamicRoutingDataSource) throws Exception {
    	//使用SqlSessionFactoryBean不可以正常使用 BaseMapper的MyBatis通用的CRUD
        //SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean();
        sessionFactory.setDataSource(dynamicRoutingDataSource);
        return sqlSessionFactoryBean.getObject();
    }

    /**
     * 重寫事務管理器,管理動態(tài)數(shù)據(jù)源
     */
    @Primary
    @Bean(value = "transactionManager")
    public PlatformTransactionManager annotationDrivenTransactionManager(DynamicRoutingDataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
}

5-3:切換使用數(shù)據(jù)源

yml配置動態(tài)數(shù)據(jù)源(數(shù)據(jù)庫@DS)與引起(If you want an embedded database (H2, HSQL or Derby))類問題,數(shù)據(jù)庫

6:方法四配置動態(tài)數(shù)據(jù)源使用,使用注解的方式(推薦使用)

6-1:添加注解和切面

package com.example.poi.minds.annotation;

import java.lang.annotation.*;

/**
 * @Author xu
 * @create 2023/9/7 22
 */
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MinDS {

    /**
     * groupName or specific database name or spring SPEL name.
     *
     * @return the database you want to switch
     */
    String value() default "";
}

package com.example.poi.minds.aop;

import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
import com.example.poi.config.DataSourceHolder;
import com.example.poi.desensitization.annotation.SensitiveDecode;
import com.example.poi.desensitization.annotation.SensitiveEncode;
import com.example.poi.desensitization.utils.SensitiveInfoUtil;
import com.example.poi.minds.annotation.MinDS;
import lombok.extern.slf4j.Slf4j;
import org.aopalliance.intercept.MethodInvocation;
import org.apache.commons.lang.StringUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;
import java.util.List;

/**
 * @Author xu
 * @create 2023/9/7 22
 */
@Slf4j
@Aspect
@Component
public class MinDSAspect {

    /**
     * 定義切點Pointcut
     */
    @Pointcut("@annotation(com.example.poi.minds.annotation.MinDS) ")
    public void dsPointCut() {
    }

    @Around("dsPointCut()")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        // 處理結(jié)果

        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Method method = signature.getMethod();

        MinDS minDS = method.getAnnotation(MinDS.class);
        String value = minDS.value();
        if (StringUtils.isBlank(value)) {
            return null;
        }
        DataSourceHolder.setDataSource(value);
        try {
            return joinPoint.proceed();
        } finally {
            DataSourceHolder.clearDataSource();
        }
    }
}

yml配置動態(tài)數(shù)據(jù)源(數(shù)據(jù)庫@DS)與引起(If you want an embedded database (H2, HSQL or Derby))類問題,數(shù)據(jù)庫文章來源地址http://www.zghlxwxcb.cn/news/detail-695852.html

6-2:動態(tài)數(shù)據(jù)源簡單的說就是能夠自由切換的數(shù)據(jù)源,Spring提供了一個抽象類AbstractRoutingDataSource,我們只需要extends ,并且重寫determineCurrentLookupKey()即可determineCurrentLookupKey()的作用:返回需要切換的數(shù)據(jù)源的key,然后根據(jù)這個key獲取對應的數(shù)據(jù)源信息

package com.example.poi.config;

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

/**
 * @Author xu
 * @create 2023/9/7 22
 */
public class DynamicDataSource extends AbstractRoutingDataSource {
    /**
     * 返回需要使用的數(shù)據(jù)源key,將會按照這個key從Map中獲取對應的數(shù)據(jù)源(切換)
     * @return
     */
    @Override
    protected Object determineCurrentLookupKey() {
        //從ThreadLocal中取出key
        return DataSourceHolder.getDataSource();
    }

}

6-3:單獨封裝一個類:DataSourceHolder,在多線程的情況下,數(shù)據(jù)源切換如何保證線程隔離呢?,我們不能這邊切換了影響了其他線程的執(zhí)行,這里我們便想到了ThreadLocal

package com.example.poi.config;

/**
 * @Author xu
 * @create 2023/9/7 20
 */
/**
 * 線程安全類:使用ThreadLocal存儲切換數(shù)據(jù)源后的KEY
 */
public class DataSourceHolder {
    /**
     * 線程ThreadLocal
     */
    private static final ThreadLocal<String> dataSources = new InheritableThreadLocal();

    /**
     * 設(shè)置數(shù)據(jù)源
     * @param datasource
     */
    public static void setDataSource(String datasource) {
        dataSources.set(datasource);
    }

    /**
     * 獲取數(shù)據(jù)源
     * @return
     */
    public static String getDataSource() {
        return dataSources.get();
    }

    /**
     * 清除數(shù)據(jù)源
     */
    public static void clearDataSource() {
        dataSources.remove();
    }

}

到了這里,關(guān)于yml配置動態(tài)數(shù)據(jù)源(數(shù)據(jù)庫@DS)與引起(If you want an embedded database (H2, HSQL or Derby))類問題的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包