//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 allResult = new ArrayList(); // try { // for (String aliasesPackage : typeAliasesPackage.split(",")) { // List result = new ArrayList(); // 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 hashResult = new HashSet(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 targetDataSources = new HashMap(); // //额外数据源配置 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("
", ""); // text = text.replaceAll("powered.*?shrek.wang", ""); // response.getWriter().write(text); // } // // @Override // public void destroy() { // } // }; // FilterRegistrationBean registrationBean = new FilterRegistrationBean(); // registrationBean.setFilter(filter); // registrationBean.addUrlPatterns(commonJsPattern); // return registrationBean; // } // //}