DruidConfig.java 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. //package com.poyee.datasource.config;
  2. //
  3. //import com.alibaba.druid.pool.DruidDataSource;
  4. //import com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties;
  5. //import com.alibaba.druid.util.Utils;
  6. //import com.poyee.datasource.DynamicDataSource;
  7. //import org.apache.ibatis.io.VFS;
  8. //import org.apache.ibatis.session.SqlSessionFactory;
  9. //import org.mybatis.spring.SqlSessionFactoryBean;
  10. //import org.mybatis.spring.boot.autoconfigure.SpringBootVFS;
  11. //import org.slf4j.Logger;
  12. //import org.slf4j.LoggerFactory;
  13. //import org.springframework.beans.factory.annotation.Autowired;
  14. //import org.springframework.beans.factory.annotation.Qualifier;
  15. //import org.springframework.beans.factory.annotation.Value;
  16. //import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
  17. //import org.springframework.boot.web.servlet.FilterRegistrationBean;
  18. //import org.springframework.context.annotation.Bean;
  19. //import org.springframework.context.annotation.Configuration;
  20. //import org.springframework.context.annotation.Primary;
  21. //import org.springframework.core.env.Environment;
  22. //import org.springframework.core.io.DefaultResourceLoader;
  23. //import org.springframework.core.io.Resource;
  24. //import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
  25. //import org.springframework.core.io.support.ResourcePatternResolver;
  26. //import org.springframework.core.type.classreading.CachingMetadataReaderFactory;
  27. //import org.springframework.core.type.classreading.MetadataReader;
  28. //import org.springframework.core.type.classreading.MetadataReaderFactory;
  29. //import org.springframework.jdbc.datasource.DataSourceTransactionManager;
  30. //import org.springframework.util.ClassUtils;
  31. //
  32. //import javax.servlet.*;
  33. //import javax.sql.DataSource;
  34. //import java.io.IOException;
  35. //import java.sql.SQLException;
  36. //import java.util.*;
  37. //
  38. //
  39. ///**
  40. // * druid 配置多数据源
  41. // *
  42. // * @author zheng
  43. // */
  44. //@Configuration
  45. //public class DruidConfig {
  46. // static final String DEFAULT_RESOURCE_PATTERN = "**/*.class";
  47. // private final Logger log = LoggerFactory.getLogger(getClass());
  48. // @Autowired
  49. // private Environment env;
  50. // //数据库连接信息
  51. // @Value("${spring.datasource.druid.master.url}")
  52. // private String dbUrl;
  53. // @Value("${spring.datasource.druid.master.username}")
  54. // private String username;
  55. // @Value("${spring.datasource.druid.master.password}")
  56. // private String password;
  57. // @Value("${spring.datasource.druid.master.driver-class-name}")
  58. // private String driverClassName;
  59. // // 连接池连接信息
  60. // @Value("${spring.datasource.druid.initialSize}")
  61. // private int initialSize;
  62. // @Value("${spring.datasource.druid.minIdle}")
  63. // private int minIdle;
  64. // @Value("${spring.datasource.druid.maxActive}")
  65. // private int maxActive;
  66. // @Value("${spring.datasource.druid.maxWait}")
  67. // private int maxWait;
  68. //
  69. // public static String setTypeAliasesPackage(String typeAliasesPackage) {
  70. // ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
  71. // MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(resolver);
  72. // List<String> allResult = new ArrayList<String>();
  73. // try {
  74. // for (String aliasesPackage : typeAliasesPackage.split(",")) {
  75. // List<String> result = new ArrayList<String>();
  76. // aliasesPackage = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX
  77. // + ClassUtils.convertClassNameToResourcePath(aliasesPackage.trim()) + "/" + DEFAULT_RESOURCE_PATTERN;
  78. // Resource[] resources = resolver.getResources(aliasesPackage);
  79. // if (resources != null && resources.length > 0) {
  80. // MetadataReader metadataReader = null;
  81. // for (Resource resource : resources) {
  82. // if (resource.isReadable()) {
  83. // metadataReader = metadataReaderFactory.getMetadataReader(resource);
  84. // try {
  85. // result.add(Class.forName(metadataReader.getClassMetadata().getClassName()).getPackage().getName());
  86. // } catch (ClassNotFoundException e) {
  87. // e.printStackTrace();
  88. // }
  89. // }
  90. // }
  91. // }
  92. // if (result.size() > 0) {
  93. // HashSet<String> hashResult = new HashSet<String>(result);
  94. // allResult.addAll(hashResult);
  95. // }
  96. // }
  97. // if (allResult.size() > 0) {
  98. // typeAliasesPackage = String.join(",", allResult.toArray(new String[0]));
  99. // } else {
  100. // throw new RuntimeException("mybatis typeAliasesPackage 路径扫描错误,参数typeAliasesPackage:" + typeAliasesPackage + "未找到任何包");
  101. // }
  102. // } catch (IOException e) {
  103. // e.printStackTrace();
  104. // }
  105. // return typeAliasesPackage;
  106. // }
  107. //
  108. // @Bean // 声明其为Bean实例
  109. // @Primary // 在同样的DataSource中,首先使用被标注的DataSource
  110. // @Qualifier("mainDataSource")
  111. // public DataSource dataSource() throws SQLException {
  112. // DruidDataSource datasource = new DruidDataSource();
  113. // // 基础连接信息
  114. // datasource.setUrl(this.dbUrl);
  115. // datasource.setUsername(username);
  116. // datasource.setPassword(password);
  117. // datasource.setDriverClassName(driverClassName);
  118. // // 连接池连接信息
  119. // datasource.setInitialSize(initialSize);
  120. // datasource.setMinIdle(minIdle);
  121. // datasource.setMaxActive(maxActive);
  122. // datasource.setMaxWait(maxWait);
  123. // datasource.setPoolPreparedStatements(true); //是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql下建议关闭。
  124. // datasource.setMaxPoolPreparedStatementPerConnectionSize(20);
  125. // datasource.setConnectionProperties("druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000");//对于耗时长的查询sql,会受限于ReadTimeout的控制,单位毫秒
  126. // datasource.setTestOnBorrow(true); //申请连接时执行validationQuery检测连接是否有效,这里建议配置为TRUE,防止取到的连接不可用
  127. // datasource.setTestWhileIdle(true);//建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
  128. // String validationQuery = "select 1 ";
  129. // datasource.setValidationQuery(validationQuery); //用来检测连接是否有效的sql,要求是一个查询语句。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会起作用。
  130. // datasource.setFilters("stat,wall");//属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有:监控统计用的filter:stat日志用的filter:log4j防御sql注入的filter:wall
  131. // datasource.setTimeBetweenEvictionRunsMillis(60000); //配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
  132. // datasource.setMinEvictableIdleTimeMillis(180000); //配置一个连接在池中最小生存的时间,单位是毫秒,这里配置为3分钟180000
  133. // datasource.setKeepAlive(true); //打开druid.keepAlive之后,当连接池空闲时,池中的minIdle数量以内的连接,空闲时间超过minEvictableIdleTimeMillis,则会执行keepAlive操作,即执行druid.validationQuery指定的查询SQL,一般为select * from dual,只要minEvictableIdleTimeMillis设置的小于防火墙切断连接时间,就可以保证当连接空闲时自动做保活检测,不会被防火墙切断
  134. // datasource.setRemoveAbandoned(true); //是否移除泄露的连接/超过时间限制是否回收。
  135. // datasource.setRemoveAbandonedTimeout(3600); //泄露连接的定义时间(要超过最大事务的处理时间);单位为秒。这里配置为1小时
  136. // datasource.setLogAbandoned(true); ////移除泄露连接发生是是否记录日志
  137. // return datasource;
  138. // }
  139. //
  140. // private DataSource initDataSource(String name) throws SQLException {
  141. // DruidDataSource datasource = new DruidDataSource();
  142. // // 基础连接信息
  143. // datasource.setUrl(env.getProperty("spring.datasource.druid." + name + ".url"));
  144. // datasource.setUsername(env.getProperty("spring.datasource.druid." + name + ".username"));
  145. // datasource.setPassword(env.getProperty("spring.datasource.druid." + name + ".password"));
  146. // datasource.setDriverClassName(driverClassName);
  147. // // 连接池连接信息
  148. // datasource.setInitialSize(initialSize);
  149. // datasource.setMinIdle(minIdle);
  150. // datasource.setMaxActive(maxActive);
  151. // datasource.setMaxWait(maxWait);
  152. // datasource.setPoolPreparedStatements(true); //是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql下建议关闭。
  153. // datasource.setMaxPoolPreparedStatementPerConnectionSize(20);
  154. // datasource.setConnectionProperties("druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000");//对于耗时长的查询sql,会受限于ReadTimeout的控制,单位毫秒
  155. // datasource.setTestOnBorrow(true); //申请连接时执行validationQuery检测连接是否有效,这里建议配置为TRUE,防止取到的连接不可用
  156. // datasource.setTestWhileIdle(true);//建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
  157. // String validationQuery = "select 1 ";
  158. // datasource.setValidationQuery(validationQuery); //用来检测连接是否有效的sql,要求是一个查询语句。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会起作用。
  159. // datasource.setFilters("stat,wall");//属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有:监控统计用的filter:stat日志用的filter:log4j防御sql注入的filter:wall
  160. // datasource.setTimeBetweenEvictionRunsMillis(60000); //配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
  161. // datasource.setMinEvictableIdleTimeMillis(180000); //配置一个连接在池中最小生存的时间,单位是毫秒,这里配置为3分钟180000
  162. // datasource.setKeepAlive(true); //打开druid.keepAlive之后,当连接池空闲时,池中的minIdle数量以内的连接,空闲时间超过minEvictableIdleTimeMillis,则会执行keepAlive操作,即执行druid.validationQuery指定的查询SQL,一般为select * from dual,只要minEvictableIdleTimeMillis设置的小于防火墙切断连接时间,就可以保证当连接空闲时自动做保活检测,不会被防火墙切断
  163. // datasource.setRemoveAbandoned(false); //是否移除泄露的连接/超过时间限制是否回收。
  164. // datasource.setRemoveAbandonedTimeout(3600); //泄露连接的定义时间(要超过最大事务的处理时间);单位为秒。这里配置为1小时
  165. // datasource.setLogAbandoned(false); ////移除泄露连接发生是是否记录日志
  166. // return datasource;
  167. // }
  168. //
  169. // @Bean(name = "dynamicDataSource")
  170. // @Qualifier("dynamicDataSource")
  171. // public DynamicDataSource dynamicDataSource() throws SQLException {
  172. // DynamicDataSource dynamicDataSource = new DynamicDataSource();
  173. // dynamicDataSource.setDebug(true);
  174. // //配置缺省的数据源
  175. // // 默认数据源配置 DefaultTargetDataSource
  176. // DataSource defaultDataSource = dataSource();
  177. // dynamicDataSource.setDefaultTargetDataSource(defaultDataSource);
  178. // Map<Object, Object> targetDataSources = new HashMap<Object, Object>();
  179. // //额外数据源配置 TargetDataSources
  180. // targetDataSources.put("mainDataSource", defaultDataSource);
  181. // try {
  182. // dynamicDataSource.testDatasource("mainDataSource",driverClassName, dbUrl, username, password);
  183. // targetDataSources.put("SLAVE", initDataSource("slave"));
  184. // } catch (Exception e) {
  185. // log.info(" 注册数据源 SLAVE 失败 ");
  186. // e.printStackTrace();
  187. // }
  188. // dynamicDataSource.setTargetDataSources(targetDataSources);
  189. // return dynamicDataSource;
  190. // }
  191. //
  192. // // @Bean
  193. // public SqlSessionFactory sqlSessionFactory() throws Exception {
  194. // String typeAliasesPackage = env.getProperty("mybatis.typeAliasesPackage");
  195. // String mapperLocations = env.getProperty("mybatis.mapperLocations");
  196. // String configLocation = env.getProperty("mybatis.configLocation");
  197. // typeAliasesPackage = setTypeAliasesPackage(typeAliasesPackage);
  198. // VFS.addImplClass(SpringBootVFS.class);
  199. // final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
  200. // sessionFactory.setDataSource(dynamicDataSource());
  201. // sessionFactory.setTypeAliasesPackage(typeAliasesPackage);
  202. // sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(mapperLocations));
  203. // sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(configLocation));
  204. // return sessionFactory.getObject();
  205. // }
  206. //
  207. //
  208. // @Bean
  209. // public DataSourceTransactionManager transactionManager(DynamicDataSource dynamicDataSource) {
  210. // return new DataSourceTransactionManager(dynamicDataSource);
  211. // }
  212. //
  213. // /**
  214. // * 去除监控页面底部的广告
  215. // */
  216. // @SuppressWarnings({"rawtypes", "unchecked"})
  217. // @Bean
  218. // @ConditionalOnProperty(name = "spring.datasource.druid.statViewServlet.enabled", havingValue = "true")
  219. // public FilterRegistrationBean removeDruidFilterRegistrationBean(DruidStatProperties properties) {
  220. // // 获取web监控页面的参数
  221. // DruidStatProperties.StatViewServlet config = properties.getStatViewServlet();
  222. // // 提取common.js的配置路径
  223. // String pattern = config.getUrlPattern() != null ? config.getUrlPattern() : "/druid/*";
  224. // String commonJsPattern = pattern.replaceAll("\\*", "js/common.js");
  225. // final String filePath = "support/http/resources/js/common.js";
  226. // // 创建filter进行过滤
  227. // Filter filter = new Filter() {
  228. // @Override
  229. // public void init(FilterConfig filterConfig) throws ServletException {
  230. // }
  231. //
  232. // @Override
  233. // public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
  234. // throws IOException, ServletException {
  235. // chain.doFilter(request, response);
  236. // // 重置缓冲区,响应头不会被重置
  237. // response.resetBuffer();
  238. // // 获取common.js
  239. // String text = Utils.readFromResource(filePath);
  240. // // 正则替换banner, 除去底部的广告信息
  241. // text = text.replaceAll("<a.*?banner\"></a><br/>", "");
  242. // text = text.replaceAll("powered.*?shrek.wang</a>", "");
  243. // response.getWriter().write(text);
  244. // }
  245. //
  246. // @Override
  247. // public void destroy() {
  248. // }
  249. // };
  250. // FilterRegistrationBean registrationBean = new FilterRegistrationBean();
  251. // registrationBean.setFilter(filter);
  252. // registrationBean.addUrlPatterns(commonJsPattern);
  253. // return registrationBean;
  254. // }
  255. //
  256. //}