zoukankan      html  css  js  c++  java
  • 动态数据源玩起来

    package com.xf.config;
    
    import java.sql.SQLException;
    import java.util.Map;
    import java.util.Set;
    import java.util.concurrent.ConcurrentHashMap;
    
    import javax.annotation.PostConstruct;
    import javax.sql.DataSource;
    
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
    
    import com.alibaba.druid.pool.DruidDataSource;
    import com.alibaba.druid.stat.DruidDataSourceStatManager;
    
    @Configuration
    public class DynamicDataSource extends AbstractRoutingDataSource {
    
        @Value("${spring.datasource.druid.url}")
        String jdbcurl;
        @Value("${spring.datasource.druid.username}")
        String username;
        @Value("${spring.datasource.druid.password}")
        String password;
    
        public Map<Object, Object> dataSources;
    
        /**
         * 每次请求动态请求哪一个数据源
         * 
         * @return
         */
        @Override
        protected Object determineCurrentLookupKey() {
            return DataSourceHolder.getDataSource();
        }
    
        /**
         * 配置文件yml中的默认数据源
         * 
         * @return
         */
    //    @Bean(name = "defaultDataSource")
    //    @ConfigurationProperties(prefix = "spring.datasource")
    //    public DataSource getDefaultDataSource() {
    //        return DruidDataSourceBuilder.create().build();
    //    }
    
    //    public DynamicDataSource() {
    //
    //    }
    
    
        /**
         * 添加数据源到目标数据源map中
         * 
         * @param datasource
         */
        public void addDataSource(String key, DruidDataSource datasource) {
            dataSources.put(key, datasource);
            super.setTargetDataSources(dataSources);
            super.afterPropertiesSet();
        }
    
        // 删除数据源
        public synchronized boolean delDatasources(String datasourceid) {
            if (dataSources.containsKey(datasourceid)) {
                Set<DruidDataSource> druidDataSourceInstances = DruidDataSourceStatManager.getDruidDataSourceInstances();
                for (DruidDataSource l : druidDataSourceInstances) {
                    if (datasourceid.equals(l.getName())) {
                        dataSources.remove(datasourceid);
                        DruidDataSourceStatManager.removeDataSource(l);
                        // 将map赋值给父类的TargetDataSources
                        setTargetDataSources(dataSources);
                        // 将TargetDataSources中的连接信息放入resolvedDataSources管理
                        super.afterPropertiesSet();
                        return true;
                    }
                }
                return false;
            } else {
                return false;
            }
        }
    
        /**
         * 此处数据库信配置,可以来源于redis等,然后再初始化所有数据源 重点说明:一个DruidDataSource数据源,它里面本身就是线程池了,
         * 所以我们不需要考虑线程池的问题
         * 
         * @param no
         * @return
         */
        public DataSource druidDataSource() {
            DruidDataSource datasource = new DruidDataSource();
            datasource.setUrl(jdbcurl);
            datasource.setUsername(username);
            datasource.setPassword(password);
    //        datasource.setDriverClassName("com.mysql.cj.jdbc.Driver");
            datasource.setInitialSize(5);
            datasource.setMinIdle(5);
            datasource.setMaxActive(100);
            // datasource.setDbType("com.alibaba.druid.pool.DruidDataSource");
            datasource.setMaxWait(60000);
            datasource.setTimeBetweenEvictionRunsMillis(60000);
            datasource.setMinEvictableIdleTimeMillis(300000);
            datasource.setValidationQuery("SELECT 1 FROM DUAL");
            datasource.setTestWhileIdle(true);
            datasource.setTestOnBorrow(false);
            datasource.setTestOnReturn(false);
            try {
    //            datasource.setFilters("stat,wall,log4j");
                datasource.setFilters("wall");
            } catch (SQLException e) {
                e.printStackTrace();
            }
            return datasource;
        }
    }

    后台兼职接单中,联系我微信:wjf88520

    by wujf

    mail:921252375@qq.com

  • 相关阅读:
    认识“委托”
    程序员的修炼之道:从小工到专家(一)
    知识的使用 与 知识的内化
    VB.Net中 Module 的前世今生
    memcached
    C#知识
    Android之垂直显示TextView
    Android开发之各个语言
    Android之hint提示字体大小修改,显示完全
    Android 之计算控件颜色透明度
  • 原文地址:https://www.cnblogs.com/wujf/p/15661550.html
Copyright © 2011-2022 走看看