| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256 |
- //package com.poyee.datasource.config;
- //
- //import com.alibaba.druid.pool.DruidDataSource;
- //import com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties;
- //import com.alibaba.druid.util.Utils;
- //import com.poyee.datasource.DynamicDataSource;
- //import org.apache.ibatis.io.VFS;
- //import org.apache.ibatis.session.SqlSessionFactory;
- //import org.mybatis.spring.SqlSessionFactoryBean;
- //import org.mybatis.spring.boot.autoconfigure.SpringBootVFS;
- //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.beans.factory.annotation.Value;
- //import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
- //import org.springframework.boot.web.servlet.FilterRegistrationBean;
- //import org.springframework.context.annotation.Bean;
- //import org.springframework.context.annotation.Configuration;
- //import org.springframework.context.annotation.Primary;
- //import org.springframework.core.env.Environment;
- //import org.springframework.core.io.DefaultResourceLoader;
- //import org.springframework.core.io.Resource;
- //import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
- //import org.springframework.core.io.support.ResourcePatternResolver;
- //import org.springframework.core.type.classreading.CachingMetadataReaderFactory;
- //import org.springframework.core.type.classreading.MetadataReader;
- //import org.springframework.core.type.classreading.MetadataReaderFactory;
- //import org.springframework.jdbc.datasource.DataSourceTransactionManager;
- //import org.springframework.util.ClassUtils;
- //
- //import javax.servlet.*;
- //import javax.sql.DataSource;
- //import java.io.IOException;
- //import java.sql.SQLException;
- //import java.util.*;
- //
- //
- ///**
- // * druid 配置多数据源
- // *
- // * @author zheng
- // */
- //@Configuration
- //public class DruidConfig {
- // static final String DEFAULT_RESOURCE_PATTERN = "**/*.class";
- // private final Logger log = LoggerFactory.getLogger(getClass());
- // @Autowired
- // private Environment env;
- // //数据库连接信息
- // @Value("${spring.datasource.druid.master.url}")
- // private String dbUrl;
- // @Value("${spring.datasource.druid.master.username}")
- // private String username;
- // @Value("${spring.datasource.druid.master.password}")
- // private String password;
- // @Value("${spring.datasource.druid.master.driver-class-name}")
- // private String driverClassName;
- // // 连接池连接信息
- // @Value("${spring.datasource.druid.initialSize}")
- // private int initialSize;
- // @Value("${spring.datasource.druid.minIdle}")
- // private int minIdle;
- // @Value("${spring.datasource.druid.maxActive}")
- // private int maxActive;
- // @Value("${spring.datasource.druid.maxWait}")
- // private int maxWait;
- //
- // public static String setTypeAliasesPackage(String typeAliasesPackage) {
- // ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
- // MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(resolver);
- // List<String> allResult = new ArrayList<String>();
- // try {
- // for (String aliasesPackage : typeAliasesPackage.split(",")) {
- // List<String> result = new ArrayList<String>();
- // aliasesPackage = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX
- // + ClassUtils.convertClassNameToResourcePath(aliasesPackage.trim()) + "/" + DEFAULT_RESOURCE_PATTERN;
- // Resource[] resources = resolver.getResources(aliasesPackage);
- // if (resources != null && resources.length > 0) {
- // MetadataReader metadataReader = null;
- // for (Resource resource : resources) {
- // if (resource.isReadable()) {
- // metadataReader = metadataReaderFactory.getMetadataReader(resource);
- // try {
- // result.add(Class.forName(metadataReader.getClassMetadata().getClassName()).getPackage().getName());
- // } catch (ClassNotFoundException e) {
- // e.printStackTrace();
- // }
- // }
- // }
- // }
- // if (result.size() > 0) {
- // HashSet<String> hashResult = new HashSet<String>(result);
- // allResult.addAll(hashResult);
- // }
- // }
- // if (allResult.size() > 0) {
- // typeAliasesPackage = String.join(",", allResult.toArray(new String[0]));
- // } else {
- // throw new RuntimeException("mybatis typeAliasesPackage 路径扫描错误,参数typeAliasesPackage:" + typeAliasesPackage + "未找到任何包");
- // }
- // } catch (IOException e) {
- // e.printStackTrace();
- // }
- // return typeAliasesPackage;
- // }
- //
- // @Bean // 声明其为Bean实例
- // @Primary // 在同样的DataSource中,首先使用被标注的DataSource
- // @Qualifier("mainDataSource")
- // public DataSource dataSource() throws SQLException {
- // DruidDataSource datasource = new DruidDataSource();
- // // 基础连接信息
- // datasource.setUrl(this.dbUrl);
- // datasource.setUsername(username);
- // datasource.setPassword(password);
- // datasource.setDriverClassName(driverClassName);
- // // 连接池连接信息
- // datasource.setInitialSize(initialSize);
- // datasource.setMinIdle(minIdle);
- // datasource.setMaxActive(maxActive);
- // datasource.setMaxWait(maxWait);
- // datasource.setPoolPreparedStatements(true); //是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql下建议关闭。
- // datasource.setMaxPoolPreparedStatementPerConnectionSize(20);
- // datasource.setConnectionProperties("druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000");//对于耗时长的查询sql,会受限于ReadTimeout的控制,单位毫秒
- // datasource.setTestOnBorrow(true); //申请连接时执行validationQuery检测连接是否有效,这里建议配置为TRUE,防止取到的连接不可用
- // datasource.setTestWhileIdle(true);//建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
- // String validationQuery = "select 1 ";
- // datasource.setValidationQuery(validationQuery); //用来检测连接是否有效的sql,要求是一个查询语句。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会起作用。
- // datasource.setFilters("stat,wall");//属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有:监控统计用的filter:stat日志用的filter:log4j防御sql注入的filter:wall
- // datasource.setTimeBetweenEvictionRunsMillis(60000); //配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
- // datasource.setMinEvictableIdleTimeMillis(180000); //配置一个连接在池中最小生存的时间,单位是毫秒,这里配置为3分钟180000
- // datasource.setKeepAlive(true); //打开druid.keepAlive之后,当连接池空闲时,池中的minIdle数量以内的连接,空闲时间超过minEvictableIdleTimeMillis,则会执行keepAlive操作,即执行druid.validationQuery指定的查询SQL,一般为select * from dual,只要minEvictableIdleTimeMillis设置的小于防火墙切断连接时间,就可以保证当连接空闲时自动做保活检测,不会被防火墙切断
- // datasource.setRemoveAbandoned(true); //是否移除泄露的连接/超过时间限制是否回收。
- // datasource.setRemoveAbandonedTimeout(3600); //泄露连接的定义时间(要超过最大事务的处理时间);单位为秒。这里配置为1小时
- // datasource.setLogAbandoned(true); ////移除泄露连接发生是是否记录日志
- // return datasource;
- // }
- //
- // private DataSource initDataSource(String name) throws SQLException {
- // DruidDataSource datasource = new DruidDataSource();
- // // 基础连接信息
- // datasource.setUrl(env.getProperty("spring.datasource.druid." + name + ".url"));
- // datasource.setUsername(env.getProperty("spring.datasource.druid." + name + ".username"));
- // datasource.setPassword(env.getProperty("spring.datasource.druid." + name + ".password"));
- // datasource.setDriverClassName(driverClassName);
- // // 连接池连接信息
- // datasource.setInitialSize(initialSize);
- // datasource.setMinIdle(minIdle);
- // datasource.setMaxActive(maxActive);
- // datasource.setMaxWait(maxWait);
- // datasource.setPoolPreparedStatements(true); //是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql下建议关闭。
- // datasource.setMaxPoolPreparedStatementPerConnectionSize(20);
- // datasource.setConnectionProperties("druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000");//对于耗时长的查询sql,会受限于ReadTimeout的控制,单位毫秒
- // datasource.setTestOnBorrow(true); //申请连接时执行validationQuery检测连接是否有效,这里建议配置为TRUE,防止取到的连接不可用
- // datasource.setTestWhileIdle(true);//建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
- // String validationQuery = "select 1 ";
- // datasource.setValidationQuery(validationQuery); //用来检测连接是否有效的sql,要求是一个查询语句。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会起作用。
- // datasource.setFilters("stat,wall");//属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有:监控统计用的filter:stat日志用的filter:log4j防御sql注入的filter:wall
- // datasource.setTimeBetweenEvictionRunsMillis(60000); //配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
- // datasource.setMinEvictableIdleTimeMillis(180000); //配置一个连接在池中最小生存的时间,单位是毫秒,这里配置为3分钟180000
- // datasource.setKeepAlive(true); //打开druid.keepAlive之后,当连接池空闲时,池中的minIdle数量以内的连接,空闲时间超过minEvictableIdleTimeMillis,则会执行keepAlive操作,即执行druid.validationQuery指定的查询SQL,一般为select * from dual,只要minEvictableIdleTimeMillis设置的小于防火墙切断连接时间,就可以保证当连接空闲时自动做保活检测,不会被防火墙切断
- // datasource.setRemoveAbandoned(false); //是否移除泄露的连接/超过时间限制是否回收。
- // datasource.setRemoveAbandonedTimeout(3600); //泄露连接的定义时间(要超过最大事务的处理时间);单位为秒。这里配置为1小时
- // datasource.setLogAbandoned(false); ////移除泄露连接发生是是否记录日志
- // return datasource;
- // }
- //
- // @Bean(name = "dynamicDataSource")
- // @Qualifier("dynamicDataSource")
- // public DynamicDataSource dynamicDataSource() throws SQLException {
- // DynamicDataSource dynamicDataSource = new DynamicDataSource();
- // dynamicDataSource.setDebug(true);
- // //配置缺省的数据源
- // // 默认数据源配置 DefaultTargetDataSource
- // DataSource defaultDataSource = dataSource();
- // dynamicDataSource.setDefaultTargetDataSource(defaultDataSource);
- // Map<Object, Object> targetDataSources = new HashMap<Object, Object>();
- // //额外数据源配置 TargetDataSources
- // targetDataSources.put("mainDataSource", defaultDataSource);
- // try {
- // dynamicDataSource.testDatasource("mainDataSource",driverClassName, dbUrl, username, password);
- // targetDataSources.put("SLAVE", initDataSource("slave"));
- // } catch (Exception e) {
- // log.info(" 注册数据源 SLAVE 失败 ");
- // e.printStackTrace();
- // }
- // dynamicDataSource.setTargetDataSources(targetDataSources);
- // return dynamicDataSource;
- // }
- //
- // // @Bean
- // public SqlSessionFactory sqlSessionFactory() throws Exception {
- // String typeAliasesPackage = env.getProperty("mybatis.typeAliasesPackage");
- // String mapperLocations = env.getProperty("mybatis.mapperLocations");
- // String configLocation = env.getProperty("mybatis.configLocation");
- // typeAliasesPackage = setTypeAliasesPackage(typeAliasesPackage);
- // VFS.addImplClass(SpringBootVFS.class);
- // final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
- // sessionFactory.setDataSource(dynamicDataSource());
- // sessionFactory.setTypeAliasesPackage(typeAliasesPackage);
- // sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(mapperLocations));
- // sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(configLocation));
- // return sessionFactory.getObject();
- // }
- //
- //
- // @Bean
- // public DataSourceTransactionManager transactionManager(DynamicDataSource dynamicDataSource) {
- // return new DataSourceTransactionManager(dynamicDataSource);
- // }
- //
- // /**
- // * 去除监控页面底部的广告
- // */
- // @SuppressWarnings({"rawtypes", "unchecked"})
- // @Bean
- // @ConditionalOnProperty(name = "spring.datasource.druid.statViewServlet.enabled", havingValue = "true")
- // public FilterRegistrationBean removeDruidFilterRegistrationBean(DruidStatProperties properties) {
- // // 获取web监控页面的参数
- // DruidStatProperties.StatViewServlet config = properties.getStatViewServlet();
- // // 提取common.js的配置路径
- // String pattern = config.getUrlPattern() != null ? config.getUrlPattern() : "/druid/*";
- // String commonJsPattern = pattern.replaceAll("\\*", "js/common.js");
- // final String filePath = "support/http/resources/js/common.js";
- // // 创建filter进行过滤
- // Filter filter = new Filter() {
- // @Override
- // public void init(FilterConfig filterConfig) throws ServletException {
- // }
- //
- // @Override
- // public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
- // throws IOException, ServletException {
- // chain.doFilter(request, response);
- // // 重置缓冲区,响应头不会被重置
- // response.resetBuffer();
- // // 获取common.js
- // String text = Utils.readFromResource(filePath);
- // // 正则替换banner, 除去底部的广告信息
- // text = text.replaceAll("<a.*?banner\"></a><br/>", "");
- // text = text.replaceAll("powered.*?shrek.wang</a>", "");
- // response.getWriter().write(text);
- // }
- //
- // @Override
- // public void destroy() {
- // }
- // };
- // FilterRegistrationBean registrationBean = new FilterRegistrationBean();
- // registrationBean.setFilter(filter);
- // registrationBean.addUrlPatterns(commonJsPattern);
- // return registrationBean;
- // }
- //
- //}
|