當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
SpringBoot_数据访问-整合Druid配置数据源监控
生活随笔
收集整理的這篇文章主要介紹了
SpringBoot_数据访问-整合Druid配置数据源监控
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
然后實際在開發的時候,我們很少用到這個數據源,比如我們用c3p0,或者開發常用的druid,這是我們阿里的數據源產品,雖然Hikarui的性能比druid要好一點,由于druid有安全監控的整個解決方案,所以我們后來開發中用到他也非常多,那我們接下來就整合duid數據源,我們不用他默認的
首先我們要引入druid數據源,我們從maven倉庫里找到他的坐標,https://mvnrepository.com/search?q=druid<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.18</version>
</dependency>我們先引入我們自定義的數據源,引入druid數據源,可以用type來指定數據源的類型,spring.datasource.type=com.alibaba.druid.pool.DruidDataSource我們指定成他,這樣數據源就切換過來了,我們看數據源能不能切成druid的呢,我們來運行,我們來看一下,數據源已經變了,class com.alibaba.druid.pool.DruidDataSource
#debug=true
#server.port=8081#server.context-path=/boot02spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
spring.http.encoding.force=truelogging.level.com.learn=trace
#logging.file=D:/springboot.log
logging.file=springboot.log
#logging.path=/spring/log
logging.pattern.console=%d{yyyy-MM-dd} [%thread] %-5level %logger{50} - %msg%n
logging.pattern.file=%d{yyyy-MM-dd} ==== [%thread] %-5level ==== %logger{50} ==== %msg%n
#spring.resources.static-locations=classpath:/hello,classpath:/learnspring.datasource.username=root
spring.datasource.password=123456
spring.datasource.url=jdbc:mysql://localhost:3306/day20
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
package com.learn.springboot;import java.sql.Connection;
import java.sql.SQLException;import javax.sql.DataSource;import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;/*** SpringBoot單元測試*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBootDataJDBCApplicationTests {@AutowiredDataSource dataSource;@Testpublic void contextLoads() throws SQLException {// org.apache.tomcat.jdbc.pool.DataSourceSystem.out.println(dataSource.getClass());Connection connection = dataSource.getConnection();System.out.println(connection);connection.close();}
}
但是數據源會有很多的屬性設置,比如druid,初始化連接池大小,等等配置,那我們配置在哪呢,那么多的屬性我就不一個一個寫了,initialSize是初始化大小,我們在DataSourceProperties里邊,并沒有相關的屬性,所以我們后邊設置的這些,并不能綁定到數據庫的配置里邊,那這寫配置默認是不起作用的,我們自己來寫一個DruidConfig,專門來配我們的druid,它是一個@Configuration,我們來創建一個數據源,并且加載容器中,但是我們要將屬性綁定上,之前默認是綁定不上的,我們只需要用一個熟悉的注解,我們把以"spring.datasource"為前綴的綁定進來,那我再來debug測試,#連接池的配置信息
spring.datasource.initialSize=5
spring.datasource.minIdle=5
spring.datasource.maxActive=20
spring.datasource.maxWait=60000
package com.learn.config;import javax.sql.DataSource;import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import com.alibaba.druid.pool.DruidDataSource;@Configuration
public class DruidConfig {@ConfigurationProperties(prefix="spring.datasource")@Beanpublic DataSource druid() {return new DruidDataSource();}}
package com.learn.springboot;import java.sql.Connection;
import java.sql.SQLException;import javax.sql.DataSource;import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;/*** SpringBoot單元測試*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBootDataJDBCApplicationTests {@AutowiredDataSource dataSource;@Testpublic void contextLoads() throws SQLException {// org.apache.tomcat.jdbc.pool.DataSourceSystem.out.println(dataSource.getClass());Connection connection = dataSource.getConnection();System.out.println(connection);connection.close();}
}
這樣我們的屬性就用上了,接下來我們來配置監控,讓他的的監控也能起到作用,這個怎么配置呢,其實與以前用過的一樣,他需要配置一個servlet,我們進入管理后臺的請求,然后再來配置一個監控的filter,我們得配上兩個這個東西,我們沒有web.xml,如果要注冊servlet,就用ServletRegistrationBean,那么這個servlet叫什么呢,StatViewServlet,幫我們監控管理后臺的servlet,我們就來配他,我們new一個ServletRegistrationBean,然后把我們的servlet傳進去,然后還要傳入一個urlMapping,我們處理druid下的所有請求,我們把servlet加入容器中,我們一般也會配置一些初始化參數,比如這個servlet能配置這些參數/*** 注意:避免直接調用Druid相關對象例如DruidDataSource等,相關調用要到DruidStatManagerFacade里用反射實現* * @author sandzhang[sandzhangtoo@gmail.com]*/
public class StatViewServlet extends ResourceServlet {private final static Log LOG = LogFactory.getLog(StatViewServlet.class);private static final long serialVersionUID = 1L;public static final String PARAM_NAME_RESET_ENABLE = "resetEnable";public static final String PARAM_NAME_JMX_URL = "jmxUrl";public static final String PARAM_NAME_JMX_USERNAME = "jmxUsername";public static final String PARAM_NAME_JMX_PASSWORD = "jmxPassword";@SuppressWarnings("serial")
public abstract class ResourceServlet extends HttpServlet {private final static Log LOG = LogFactory.getLog(ResourceServlet.class);public static final String SESSION_USER_KEY = "druid-user";public static final String PARAM_NAME_USERNAME = "loginUsername";public static final String PARAM_NAME_PASSWORD = "loginPassword";public static final String PARAM_NAME_ALLOW = "allow";public static final String PARAM_NAME_DENY = "deny";public static final String PARAM_REMOTE_ADDR = "remoteAddress";初始化參數怎么配呢,allow不寫就是默認允許所有,我來配置一個deny來拒絕,拒絕這個ip地址來訪問,注冊filter需要FilterRegistrationBean,我們這個filter叫WebStatFilter,就來注冊他,/*** 用于配置Web和Druid數據源之間的管理關聯監控統計* * @author wenshao [szujobs@htomail.com]* @author Zhangming Qi [qizhanming@gmail.com]*/
public class WebStatFilter extends AbstractWebStatImpl implements Filter {private final static Log LOG = LogFactory.getLog(WebStatFilter.class);public final static String PARAM_NAME_PROFILE_ENABLE = "profileEnable";public final static String PARAM_NAME_SESSION_STAT_ENABLE = "sessionStatEnable";public final static String PARAM_NAME_SESSION_STAT_MAX_COUNT = "sessionStatMaxCount";public static final String PARAM_NAME_EXCLUSIONS = "exclusions";public static final String PARAM_NAME_PRINCIPAL_SESSION_NAME = "principalSessionName";public static final String PARAM_NAME_PRINCIPAL_COOKIE_NAME = "principalCookieName";public static final String PARAM_NAME_REAL_IP_HEADER = "realIpHeader";我們看能不能來到druid的管理后臺localhost:8080/druid按照我們指定的用戶名和密碼,還有WEB應用的數據監控,我們配了web filter,都能監控到WEB應用的相關信息,我們就來發一個請求,localhost:8080/query來查詢數據的請求,這個數據就算是查出來了,包括來到我們的后臺,還可以看到SQL監控,JDBC執行次數,執行的時間,druid就配置成功了
package com.learn.config;import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;import javax.sql.DataSource;import org.springframework.boot.context.properties.ConfigurationProperties;
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 com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;@Configuration
public class DruidConfig {@ConfigurationProperties(prefix="spring.datasource")@Beanpublic DataSource druid() {return new DruidDataSource();}// 配置Druid的監控// 1.配置一個管理后臺的Servlet// 2.配置一個監控的Filter@Beanpublic ServletRegistrationBean statViewServlet() {ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(),"/druid/*");Map<String,String> initParams = new HashMap<String,String>();initParams.put("loginUsername", "admin");initParams.put("loginPassword", "123456");initParams.put("allow", "");initParams.put("deny", "192.168.15.21");// 默認就是允許所有訪問bean.setInitParameters(initParams);return bean;}// 2.配置一個web監控的filter@Beanpublic FilterRegistrationBean webStatFilter() {FilterRegistrationBean bean = new FilterRegistrationBean();bean.setFilter(new WebStatFilter());Map<String,String> initParams = new HashMap<String,String>(); initParams.put("exclusions", "*.js,*.css,/druid/*");bean.setInitParameters(initParams);bean.setUrlPatterns(Arrays.asList("/*"));return bean;}
}
?
總結
以上是生活随笔為你收集整理的SpringBoot_数据访问-整合Druid配置数据源监控的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SpringBoot_数据访问-JDBC
- 下一篇: SpringBoot_数据访问-整合My