美文网首页
springboot中整合 jdbc ,druid 多数据源操作

springboot中整合 jdbc ,druid 多数据源操作

作者: 骑蚂蚁上高速_jun | 来源:发表于2020-08-08 22:08 被阅读0次

    (1) . 导入相关依赖

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>compile</scope>
    </dependency>
    
    <!-- 使用 阿里的druid 数据源作为数据库连接池,代替springboot中默认的 Hikari 数据源-->
    <!-- 可以不配置,根据自己的需要是否需要 , 不过做后台任务一般建议使用 -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.1.23</version>
    </dependency>
    

    (2) . 配置 application.yaml

    spring:
      datasource:
        # druid数据源配置
        type: com.alibaba.druid.pool.DruidDataSource
        initialSize: 10
        minIdle: 10
        maxActive: 200
        # 配置获取连接等待超时的时间
        maxWait: 60000
        # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
        timeBetweenEvictionRunsMillis: 60000
        # 配置一个连接在池中最小生存的时间,单位是毫秒
        minEvictableIdleTimeMillis: 30000
        validationQuery: select 'x'
        testWhileIdle: true
        testOnBorrow: false
        testOnReturn: false
        # 打开PSCache,并且指定每个连接上PSCache的大小
        poolPreparedStatements: true
        maxPoolPreparedStatementPerConnectionSize: 20
        # 配置监控统计拦截的filters
        filters: stat,wall,slf4j
        # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
        connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
    
    # 23个站点数据库配置
    mysql:
      jp:
        name: 日本
        url: jdbc:mysql://localhost:3306/zmkm?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai&autoReconnect=true&failOverReadOnly=false&rewriteBatchedStatements=true
        username: root
        password: "123456"
        driver-class-name: com.mysql.cj.jdbc.Driver
      rom:
        name: 罗马尼亚
        url: jdbc:mysql://localhost:3306/rom?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai&autoReconnect=true&failOverReadOnly=false&rewriteBatchedStatements=true
        username: root
        password: "123456"
        driver-class-name: com.mysql.cj.jdbc.Driver
    
    

    (3) . 配置 DruidDataSource 并绑定到容器

    package com.wangjun.daxingxing.configuration;
    
    import com.alibaba.druid.pool.DruidDataSource;
    import com.alibaba.druid.support.http.StatViewServlet;
    import com.alibaba.druid.support.http.WebStatFilter;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.boot.jdbc.DataSourceBuilder;
    import org.springframework.boot.web.servlet.FilterRegistrationBean;
    import org.springframework.boot.web.servlet.ServletRegistrationBean;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.jdbc.core.JdbcTemplate;
    
    import javax.servlet.Filter;
    import javax.sql.DataSource;
    import java.sql.SQLException;
    import java.util.Arrays;
    import java.util.HashMap;
    import java.util.Map;
    
    /**
     * 子站点数据源
     */
    @Configuration
    public class MysqlSiteConfiguration {
    
        @Value("${mysql.jp.name}")
        private String jpName;
        @Value("${mysql.rom.name}")
        private String romName;
    
        // 日本站点的数据源 ,默认使用 harki数据源
        @Bean // 默认的Bean名称就是方法名
        @ConfigurationProperties(prefix = "mysql.jp")
        public DataSource jpDatasource(){
            // return DataSourceBuilder.create().build();
            DruidDataSource dataSource = new DruidDataSource();
            dataSource.setInitialSize(10);
            dataSource.setMinIdle(10);
            dataSource.setMaxActive(200);
            dataSource.setMaxWait(60000);
            dataSource.setTimeBetweenEvictionRunsMillis(60000);
            dataSource.setMinEvictableIdleTimeMillis(30000);
            dataSource.setValidationQuery("select 1");
            dataSource.setTestWhileIdle(true);
            dataSource.setTestOnBorrow(false);
            dataSource.setTestOnReturn(false);
            dataSource.setPoolPreparedStatements(true);
            dataSource.setMaxPoolPreparedStatementPerConnectionSize(20);
    
            /**
             * 这个是用来配置 druid 监控sql语句的 非常有用 如果你有两个数据源 这个配置哪个数据源就监控哪个数据源的sql 同时配置那就都监控
             */
            try {
                dataSource.setFilters("stat,wall,slf4j");
            } catch (SQLException e) {
                e.printStackTrace();
            }
            dataSource.setName(jpName);
            dataSource.setConnectionProperties("druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000");
            return dataSource;
        }
        // 日本站点的jdbc实例
        @Bean // 默认的Bean名称就是方法名
        public JdbcTemplate jpJdbcTemplate(
            @Qualifier("jpDatasource") DataSource dataSource
        ){
            return new JdbcTemplate(dataSource);
        }
    
    
    
        // 罗马尼亚站点的数据源 ,默认使用 harki数据源
        @Bean // 默认的Bean名称就是方法名
        @ConfigurationProperties(prefix = "mysql.rom")
        public DataSource romDatasource(){
            DruidDataSource dataSource = new DruidDataSource();
            dataSource.setInitialSize(10);
            dataSource.setMinIdle(10);
            dataSource.setMaxActive(200);
            dataSource.setMaxWait(60000);
            dataSource.setTimeBetweenEvictionRunsMillis(60000);
            dataSource.setMinEvictableIdleTimeMillis(30000);
            dataSource.setValidationQuery("select 1");
            dataSource.setTestWhileIdle(true);
            dataSource.setTestOnBorrow(false);
            dataSource.setTestOnReturn(false);
            dataSource.setPoolPreparedStatements(true);
            dataSource.setMaxPoolPreparedStatementPerConnectionSize(20);
            dataSource.setName(romName);
    
            /**
             * 这个是用来配置 druid 监控sql语句的 非常有用 如果你有两个数据源 这个配置哪个数据源就监控哪个数据源的sql 同时配置那就都监控
             */
            try {
                dataSource.setFilters("stat,wall,slf4j");
            } catch (SQLException e) {
                e.printStackTrace();
            }
            dataSource.setConnectionProperties("druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000");
            return dataSource;
        }
        // 罗马尼亚站点的jdbc实例
        @Bean // 默认的Bean名称就是方法名
        public JdbcTemplate romJdbcTemplate(
                @Qualifier("romDatasource") DataSource dataSource
        ){
            return new JdbcTemplate(dataSource);
        }
    
        // 配置 druid 监控 的web面板
        @Bean
        public ServletRegistrationBean staViewServlet(){
            ServletRegistrationBean<StatViewServlet> bean = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");
            Map<String,String> initParams = new HashMap<>();
            //设置servlet初始化参数
            initParams.put("loginUsername","admin");// druid登陆名
            initParams.put("loginPassword","123456");// druid密码
            initParams.put("allow","");//默认就是允许所有访问
            initParams.put("deny","192.168.15.21");//拒绝相对应的id访问
            bean.setInitParameters(initParams);
            //加载到容器中
            return bean;
        }
    
        //2.配置一个web监控的filter
        @Bean
        public FilterRegistrationBean webStatFilter(){
            FilterRegistrationBean<Filter> bean = new FilterRegistrationBean<>();
            bean.setFilter(new WebStatFilter());
            Map<String,String> initParams = new HashMap<>();
            //设置filter初始化参数、
            initParams.put("exclusions","*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*");//排除静态资源和请求
            bean.setInitParameters(initParams);
            //拦截所有请求
            bean.setUrlPatterns(Arrays.asList("/*"));
            //加载到容器中
            return bean;
        }
    
    }
    
    

    // 配置成功后,访问 http://localhost:8080/druid 即可以查看druid监控面板

    image.png
    (4) . 基本使用
     
         @Autowired  // 依赖注入 日本站点数据库
        @Qualifier("jpJdbcTemplate")
        JdbcTemplate jpJdbcTemplate;
    
        @Autowired  // 依赖注入 jdbcTemplate
        @Qualifier("romJdbcTemplate")  # 数据源 rom
        JdbcTemplate romJdbcTemplate;
    
    
        @Override
        public void run(String... args) {
            logger.error("框架初始化加载执行的代码");
    
            String sql = "insert into user(name,password,is_active,createtime) values (?,?,?,?)";
            KeyHolder keyHolder = new GeneratedKeyHolder();
            int r = 0;
            try{
                r = template.update(new PreparedStatementCreator() {
                    @Override
                    public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
                        String name = "wangjun";
                        String pwd = "123456";
                        String password = null;
                        try {
                            password = DigestUtils.sha1Hex(pwd.getBytes("UTF-8"));
                        } catch (UnsupportedEncodingException e) {
                            logger.error("sha1Hex failed"); // 记录日志
                        }
                        byte is_active = 0;
                        PreparedStatement preparedStatement = connection.prepareStatement(sql, new String[]{"id"});
                        preparedStatement.setString(1, name);
                        preparedStatement.setString(2, password);
                        preparedStatement.setByte(3,is_active);
                        preparedStatement.setDate(4,new java.sql.Date(System.currentTimeMillis()));
                        return preparedStatement;
                    }
                }, keyHolder);
            }catch(Throwable e){
                logger.error("execute error: " + e.getMessage()); // 记录日志
            }
            if(r > 0){
                long id =  keyHolder.getKey().longValue();
                System.out.println("主键 -> " + id);
            } else{
                System.out.println("写入数据库失败");
            }
            // 数据源如果为 HikariDataSource,则表示使用默认的 jdbc操作mysql
            System.out.println("数据源:"+jpJdbcTemplate.getDataSource().getClass().toString()); // 查看数据源是否为 Druid
    
        }
    

    相关文章

      网友评论

          本文标题:springboot中整合 jdbc ,druid 多数据源操作

          本文链接:https://www.haomeiwen.com/subject/rhrkdktx.html