1. 程式人生 > >SpringBoot動態數據源 Druid及監控配置

SpringBoot動態數據源 Druid及監控配置

frame 實現類 密碼 ids tro 是否 cloud ole jdb

package com.creditcore.services.common.dataSource;

import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.context.properties.EnableConfigurationProperties;
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.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.support.http.StatViewServlet; import com.alibaba.druid.support.http.WebStatFilter; /** * springboot集成mybatis的基本入口 * 1)創建數據源(如果采用的是默認的tomcat-jdbc數據源,則不需要) * 2)創建SqlSessionFactory * 3)配置事務管理器,除非需要使用事務,否則不用配置 */ @Configuration // 該註解類似於spring配置文件 // @MapperScan(basePackages = "com.xxx.firstboot.mapper") @EnableConfigurationProperties(DataSourceConfiguration.class) public class MyBatisConfig { private static final Logger logger = LoggerFactory.getLogger(MyBatisConfig.class); // @Autowired // private Environment env; // @Value("${info.build.name:Hello default}") // private String projectName; @Autowired private DataSourceConfiguration dataSourceConfiguration; // mybaits mapper xml搜索路徑 private static final String MAPPER_LOCATION = "classpath:mapper/*.xml"; // 從cloud config上讀取配置信息,生成數據源Map 定義bean :dataSources @Bean @Primary @ConditionalOnMissingBean(name="dataSources") public Map<String, DataSource> dataSources() { //System.out.println(projectName); List<Map<String, String>> configList = dataSourceConfiguration.getConfiglist(); Map<String, DataSource> dsMap = new HashMap<String, DataSource>(); // 配置數據源的相關信息 for (Map<String, String> configMap : configList) { DruidDataSource dataSource = new DruidDataSource(); dataSource.setDriverClassName(configMap.get("driverClassName")); dataSource.setUrl(configMap.get("url")); dataSource.setUsername(configMap.get("username")); dataSource.setPassword(configMap.get("password")); // 配置初始化大小、最小、最大 dataSource.setInitialSize(Integer.parseInt(configMap.get("initialSize"))); dataSource.setMinIdle(Integer.parseInt(configMap.get("minIdle"))); dataSource.setMaxActive(Integer.parseInt(configMap.get("maxActive"))); // 配置獲取連接等待超時的時間 dataSource.setMaxWait(Integer.parseInt(configMap.get("maxWait"))); // 配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒 dataSource.setTimeBetweenEvictionRunsMillis(Integer.parseInt(configMap.get("timeBetweenEvictionRunsMillis"))); // 配置一個連接在池中最小生存的時間,單位是毫秒 dataSource.setMinEvictableIdleTimeMillis(Integer.parseInt(configMap.get("minEvictableIdleTimeMillis"))); dataSource.setValidationQuery(configMap.get("validationQuery")); dataSource.setTestWhileIdle(Boolean.parseBoolean(configMap.get("testWhileIdle"))); dataSource.setTestOnBorrow(Boolean.parseBoolean(configMap.get("testOnBorrow"))); dataSource.setTestOnReturn(Boolean.parseBoolean(configMap.get("testOnReturn"))); // 打開PSCache dataSource.setPoolPreparedStatements(Boolean.parseBoolean(configMap.get("poolPreparedStatements"))); // 指定每個連接上PSCache的大小 dataSource.setMaxPoolPreparedStatementPerConnectionSize(Integer.parseInt(configMap.get("maxPoolPreparedStatementPerConnectionSize"))); try { // 配置監控統計攔截的filters,去掉後監控界面sql無法統計,‘wall‘用於防火墻 dataSource.setFilters(configMap.get("filters")); } catch (SQLException e) { logger.error("druid configuration initialization filter", e); } // 通過connectProperties屬性來打開mergeSql功能;慢SQL記錄 dataSource.setConnectionProperties(configMap.get("connectionProperties")); // 合並多個DruidDataSource的監控數據 dataSource.setUseGlobalDataSourceStat(true); dsMap.put(configMap.get("key"), dataSource); } return dsMap; } /** * @Primary 該註解表示在同一個接口有多個實現類可以註入的時候,默認選擇哪一個,而不是讓@autowire註解報錯 * @Qualifier 根據名稱進行註入,通常是在具有相同的多個類型的實例的一個註入(例如有多個DataSource類型的實例) */ // 定義bean:dataSource // dataSources的值來源於上面定義的dataSources @Bean @Primary public DynamicDataSource dataSource(@Qualifier("dataSources")Map<String, DataSource> dataSources) { Map<Object, Object> targetDataSources = new HashMap<>(); for (String key : dataSources.keySet()) { targetDataSources.put(key, dataSources.get(key)); } DynamicDataSource dataSource = new DynamicDataSource(); dataSource.setTargetDataSources(targetDataSources);// 該方法是AbstractRoutingDataSource的方法 dataSource.setDefaultTargetDataSource(targetDataSources.get("default"));// 默認的datasource設置為myTestDbDataSource return dataSource; } /** * 根據數據源創建SqlSessionFactory */ // 定義bean:sqlSessionFactory // dataSource的值來源於上面定義的dataSource @Bean public SqlSessionFactory sqlSessionFactory(DynamicDataSource dataSource) throws Exception { SqlSessionFactoryBean fb = new SqlSessionFactoryBean(); fb.setDataSource(dataSource);// 指定數據源(這個必須有,否則報錯) // 下邊兩句僅僅用於*.xml文件,如果整個持久層操作不需要使用到xml文件的話(只用註解就可以搞定),則不加 // fb.setTypeAliasesPackage(env.getProperty("mybatis.typeAliasesPackage"));// // 指定基包 try { fb.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(MAPPER_LOCATION));// } catch (Exception e) { // 有的工程不需要操作DB的沒有MAPPER文件,防止啟動報錯 e.printStackTrace(); } return fb.getObject(); } /** * 配置事務管理器 */ @Bean public DataSourceTransactionManager transactionManager(DynamicDataSource dataSource) throws Exception { return new DataSourceTransactionManager(dataSource); } @Bean public ServletRegistrationBean druidServlet() { ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*"); //白名單: servletRegistrationBean.addInitParameter("allow", ""); //IP黑名單 (存在共同時,deny優先於allow) : 如果滿足deny的話提示:Sorry, you are not permitted to view this page. servletRegistrationBean.addInitParameter("deny", "192.168.1.73"); //登錄查看信息的賬號密碼. servletRegistrationBean.addInitParameter("loginUsername", "admin"); servletRegistrationBean.addInitParameter("loginPassword", "123456"); //是否能夠重置數據. servletRegistrationBean.addInitParameter("resetEnable", "false"); return servletRegistrationBean; } @Bean public FilterRegistrationBean filterRegistrationBean() { FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(); filterRegistrationBean.setFilter(new WebStatFilter()); filterRegistrationBean.addUrlPatterns("/*"); filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"); return filterRegistrationBean; } }

SpringBoot動態數據源 Druid及監控配置