SpringBoot整合Druid數據鏈接池
Druid是什麼?
Druid是Alibaba開源的的數據庫鏈接池。Druid可以提供強大的監控和擴展功能。css
在哪裏下載druid
maven中央倉庫: http://central.maven.org/maven2/com/alibaba/druid/java
怎麼獲取Druid的源碼
Druid是一個開源項目,源碼託管在github上,源代碼倉庫地址是 https://github.com/alibaba/druid。同時每次Druid發佈正式版本和快照的時候,都會把源碼打包,你能夠從上面的下載地址中找到相關版本的源碼mysql
怎麼配置maven
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <!-- 可經過中央倉庫獲取最新的版本號,這裏用我項目中的版本號 --> <version>1.0.11</version> </dependency>
開始配置
- 首先是 application.properties
# 數據庫配置 spring.datasource.driver-class-name=com.mysql.jdbc.Driver # 注:此處必須用 Druid 的數據源 spring.datasource.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.name=test spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test spring.datasource.username=root spring.datasource.password=root spring.datasource.initialSize=5 spring.datasource.minIdle=5 spring.datasource.maxActive=10 spring.datasource.maxWait=60000 spring.datasource.timeBetweenEvictionRunsMillis=3600000 spring.datasource.minEvictableIdleTimeMillis=3600000 spring.datasource.validationQuery=select 'x' spring.datasource.testWhileIdle=true spring.datasource.testOnBorrow=true spring.datasource.testOnReturn=false spring.datasource.poolPreparedStatements=true spring.datasource.maxPoolPreparedStatementPerConnectionSize=20 spring.datasource.filters=stat,wall,slf4j spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 spring.datasource.useGlobalDataSourceStat=true # druid 登陸信息 druid.config.user-name=root druid.config.password=root druid.config.url-mapping=/druid/*
- 封裝數據庫配置到 Java Bean
@Configuration @ConfigurationProperties(prefix = "spring.datasource") public class DBProperties { private String url; private String username; private String password; private String driverClassName; private int initialSize; private int minIdle; private int maxActive; private int maxWait; private int timeBetweenEvictionRunsMillis; private int minEvictableIdleTimeMillis; private String validationQuery; private boolean testWhileIdle; private boolean testOnBorrow; private boolean testOnReturn; private boolean poolPreparedStatements; private int maxPoolPreparedStatementPerConnectionSize; private String filters; private String connectionProperties; private boolean useGlobalDataSourceStat; public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getDriverClassName() { return driverClassName; } public void setDriverClassName(String driverClassName) { this.driverClassName = driverClassName; } public int getInitialSize() { return initialSize; } public void setInitialSize(int initialSize) { this.initialSize = initialSize; } public int getMinIdle() { return minIdle; } public void setMinIdle(int minIdle) { this.minIdle = minIdle; } public int getMaxActive() { return maxActive; } public void setMaxActive(int maxActive) { this.maxActive = maxActive; } public int getMaxWait() { return maxWait; } public void setMaxWait(int maxWait) { this.maxWait = maxWait; } public int getTimeBetweenEvictionRunsMillis() { return timeBetweenEvictionRunsMillis; } public void setTimeBetweenEvictionRunsMillis(int timeBetweenEvictionRunsMillis) { this.timeBetweenEvictionRunsMillis = timeBetweenEvictionRunsMillis; } public int getMinEvictableIdleTimeMillis() { return minEvictableIdleTimeMillis; } public void setMinEvictableIdleTimeMillis(int minEvictableIdleTimeMillis) { this.minEvictableIdleTimeMillis = minEvictableIdleTimeMillis; } public String getValidationQuery() { return validationQuery; } public void setValidationQuery(String validationQuery) { this.validationQuery = validationQuery; } public boolean isTestWhileIdle() { return testWhileIdle; } public void setTestWhileIdle(boolean testWhileIdle) { this.testWhileIdle = testWhileIdle; } public boolean isTestOnBorrow() { return testOnBorrow; } public void setTestOnBorrow(boolean testOnBorrow) { this.testOnBorrow = testOnBorrow; } public boolean isTestOnReturn() { return testOnReturn; } public void setTestOnReturn(boolean testOnReturn) { this.testOnReturn = testOnReturn; } public boolean isPoolPreparedStatements() { return poolPreparedStatements; } public void setPoolPreparedStatements(boolean poolPreparedStatements) { this.poolPreparedStatements = poolPreparedStatements; } public int getMaxPoolPreparedStatementPerConnectionSize() { return maxPoolPreparedStatementPerConnectionSize; } public void setMaxPoolPreparedStatementPerConnectionSize(int maxPoolPreparedStatementPerConnectionSize) { this.maxPoolPreparedStatementPerConnectionSize = maxPoolPreparedStatementPerConnectionSize; } public String getFilters() { return filters; } public void setFilters(String filters) { this.filters = filters; } public String getConnectionProperties() { return connectionProperties; } public void setConnectionProperties(String connectionProperties) { this.connectionProperties = connectionProperties; } public boolean isUseGlobalDataSourceStat() { return useGlobalDataSourceStat; } public void setUseGlobalDataSourceStat(boolean useGlobalDataSourceStat) { this.useGlobalDataSourceStat = useGlobalDataSourceStat; } }
@Configuration @ConfigurationProperties(prefix = "druid.config") public class DruidProperties { private String userName; private String password; private String urlMapping; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getUrlMapping() { return urlMapping; } public void setUrlMapping(String urlMapping) { this.urlMapping = urlMapping; } }
- 配置數據源
/** * 持久層相關配置 */ @Configuration public class SessionFactoryConfig { private static final Logger LOGGER = LoggerFactory.getLogger(SessionFactoryConfig.class); private final DBProperties db; @Autowired public SessionFactoryConfig(DBProperties db) { this.db = db; } /** * 建立數據源 */ @Bean // 若是訪問 Druid 時數據源頁面顯示 (*) property for user to setup 可用下面的 Bean 注入方式 // @Bean(destroyMethod = "close", initMethod = "init") public DruidDataSource druidDataSource() { final DruidDataSource datasource = new DruidDataSource(); datasource.setUrl(db.getUrl()); datasource.setUsername(db.getUsername()); datasource.setPassword(db.getPassword()); datasource.setDriverClassName(db.getDriverClassName()); datasource.setInitialSize(db.getInitialSize()); datasource.setMinIdle(db.getMinIdle()); datasource.setMaxActive(db.getMaxActive()); datasource.setMaxWait(db.getMaxWait()); datasource.setTimeBetweenEvictionRunsMillis(db.getTimeBetweenEvictionRunsMillis()); datasource.setMinEvictableIdleTimeMillis(db.getMinEvictableIdleTimeMillis()); datasource.setValidationQuery(db.getValidationQuery()); datasource.setTestOnReturn(db.isTestOnReturn()); datasource.setPoolPreparedStatements(db.isPoolPreparedStatements()); datasource.setMaxPoolPreparedStatementPerConnectionSize(db.getMaxPoolPreparedStatementPerConnectionSize()); datasource.setUseGlobalDataSourceStat(db.isUseGlobalDataSourceStat()); try { datasource.setFilters(db.getFilters()); } catch (SQLException e) { log.info("setFilters Exception ={}", e); } datasource.setConnectionProperties(db.getConnectionProperties()); return datasource; } }
- Druid鏈接池配置
/** * Druid鏈接池配置 */ @Configuration public class DruidConfiguration { private static final Logger LOGGER = LoggerFactory.getLogger(DruidConfiguration.class); private final DruidProperties druidProperties; @Autowired public DruidConfiguration(DruidProperties dp) { this.druidProperties = dp; } /** * 訪問路徑及用戶名、密碼 */ @Bean public ServletRegistrationBean druidConfig() { LOGGER.info("init Druid Servlet Configuration "); final ServletRegistrationBean srb = new ServletRegistrationBean(); srb.setServlet(new StatViewServlet()); LOGGER.info("Druid Config Info --> {}", druidProperties); srb.addUrlMappings(druidProperties.getUrlMapping()); srb.addInitParameter("loginUsername", druidProperties.getUserName()); srb.addInitParameter("loginPassword", druidProperties.getPassword()); return srb; } /** * 配置過濾器 */ @Bean public FilterRegistrationBean filterRegistrationBean() { final FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(); filterRegistrationBean.setFilter(new WebStatFilter()); filterRegistrationBean.addUrlPatterns("/*"); filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"); return filterRegistrationBean; } }
- 委託Druid進行Spring 監控
/** * 委託Druid進行Spring 監控 */ @Configuration public class SpringMonitoringConfig { @Bean(name = "druid-stat-interceptor") public DruidStatInterceptor druidStatInterceptor() { return new DruidStatInterceptor(); } @Bean(name = "druid-stat-pointcut") // 非單例 @Scope("prototype") public JdkRegexpMethodPointcut druidStatPointcut() { final JdkRegexpMethodPointcut pointcut = new JdkRegexpMethodPointcut(); // 這裏是你Controller包的路徑 pointcut.setPatterns("com.xxx.controller.*", "com.xxx.mapper.*"); return pointcut; } @Bean public DefaultPointcutAdvisor druidStatAdvisor(@Qualifier("druid-stat-interceptor") final DruidStatInterceptor druidStatInterceptor, @Qualifier("druid-stat-pointcut") final JdkRegexpMethodPointcut druidStatPointcut) { final DefaultPointcutAdvisor defaultPointAdvisor = new DefaultPointcutAdvisor(); defaultPointAdvisor.setPointcut(druidStatPointcut); defaultPointAdvisor.setAdvice(druidStatInterceptor); return defaultPointAdvisor; } }
- 項目啓動,訪問 http://127.0.0.1:端口號/druid
若是出現以上頁面,恭喜你。整合 OK :-)git