Java 中經常使用的數據庫鏈接池有 C3P0、Hikari、Druid 等。數據庫的鏈接池,對於整個項目的性能仍是很關鍵的,所以全部的 Java 項目當中都會使用數據庫鏈接池。在 Java 的各類數據庫鏈接池中,Druid 是阿里巴巴推出的開源的、號稱最好用數據庫鏈接池,它提供了強大的監控和擴展功能。Druid 在 github 的地址以下:css
https://github.com/alibaba/druid/wiki/常見問題java
本次來整理一下關於 Spring 和 Druid 的整合。mysql
建立 SpringBoot 項目git
在整合 Druid 以前,須要先建立一個 SpringBoot 和 MyBatis 的項目,先來觀察一下,它默認是否使用了數據庫鏈接池,使用了什麼數據庫鏈接池。而後,再來整合 Druid 這款數據庫鏈接池到項目當中。github
建立 SpringBoot 和 Mybatis 的項目很簡單,經過嚮導便可完成。建立項目後的依賴以下:web
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.3</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency>
其中的依賴不多,添加了 SpringMVC、Mybatis 和 MySQL。有了依賴以後,添加數據庫的配置,不然項目沒法啓動。數據庫的配置以下:spring
spring:
datasource:
url: jdbc:mysql://192.168.0.106:3306/scms?serverTimezone=UTC
username: root
password:
有了上面的配置,項目就能夠啓動了,不過整個項目沒有任何功能啓動也無心義。所以來寫一個簡單的單元測試,代碼以下:sql
@Autowired DataSource dataSource; @Test void contextLoads() throws SQLException { System.out.println(dataSource.getClass()); Connection connection = dataSource.getConnection(); System.out.println(connection); }
有了單元測試以後,直接運行單元測試的代碼,輸出結果以下:
class com.zaxxer.hikari.HikariDataSource 2020-10-02 11:17:41.279 INFO 25817 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... 2020-10-02 11:17:41.457 INFO 25817 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. HikariProxyConnection@1405548909 wrapping com.mysql.cj.jdbc.ConnectionImpl@435cc7f9 2020-10-02 11:17:41.472 INFO 25817 --- [extShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... 2020-10-02 11:17:41.482 INFO 25817 --- [extShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed.
能夠看到,雖然在項目中沒有整合任何的數據庫鏈接池,可是 Spring 默認整合了 Hikari 這個數據庫鏈接池。可是,咱們想要使用的是 Druid,那麼該如何作?數據庫
整合 Druidmybatis
整合 Druid 的方法也比較簡單的,引入 Druid 的相關依賴,並修改數據庫的配置便可。依賴以下:
<!-- https://mvnrepository.com/artifact/com.alibaba/druid --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.24</version> </dependency>
修改數據庫的配置只須要增長一行配置便可,配置以下:
spring:
datasource:
url: jdbc:mysql://192.168.0.106:3306/scms?serverTimezone=UTC
username: root
password:
type: com.alibaba.druid.pool.DruidDataSource
比較前面的配置,咱們的配置增長了一行配置,而後咱們接着運行前面的單元測試代碼。輸出以下:
class com.alibaba.druid.pool.DruidDataSource
2020-10-02 12:01:18.784 INFO 26316 --- [ main] com.alibaba.druid.pool.DruidDataSource : {dataSource-1} inited
com.mysql.cj.jdbc.ConnectionImpl@3f0d6038
2020-10-02 12:01:18.920 INFO 26316 --- [extShutdownHook] com.alibaba.druid.pool.DruidDataSource : {dataSource-1} closing ...
2020-10-02 12:01:18.921 INFO 26316 --- [extShutdownHook] com.alibaba.druid.pool.DruidDataSource : {dataSource-1} closed
2020-10-02 12:01:18.922 INFO 26316 --- [extShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor'
能夠看到,數據庫鏈接池已經變成了 alibaba 的 Druid 了。
固然了,這不能算完,由於數據庫鏈接池仍是有不少配置的,咱們添加一些配置,配置以下:
spring:
datasource:
url: jdbc:mysql://192.168.0.106:3306/scms?serverTimezone=UTC
username: root
password:
type: com.alibaba.druid.pool.DruidDataSource
initialSize: 5
minIdle: 5
maxActive: 20
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
上面的配置對 Druid 進行相關的配置,可是添加上配置是否能生效,修改咱們的單元測試代碼並運行,單元測試代碼修改以下:
DruidDataSource druidDataSource = (DruidDataSource)dataSource; System.out.println("initialSize: " + druidDataSource.getInitialSize()); System.out.println("maxActive: " + druidDataSource.getMaxActive());
運行修改後的單元測試,查看輸出:
initialSize: 0
maxActive: 8
能夠看到,並無按照咱們的預期進行輸出,由於配置並無被讀取。咱們須要可以將修改的配置進行讀取。
讀取數據庫鏈接池配置
想要使用數據庫鏈接池的配置,那麼就須要定義一個讀取配置的類,並從新實例化一個 DataSource 類。代碼以下:
@Configuration public class DruidConfig { @ConfigurationProperties(prefix = "spring.datasource") @Bean public DataSource druidDataSource() { return new DruidDataSource(); } }
再次運行單元測試,查看輸出:
initialSize: 5
maxActive: 20
能夠看到,如今的輸出結果已經和配置相同了。
配置監控
在前面已經提到過,Druid 有強大的監控功能,可是須要咱們進行簡單的代碼編寫才能夠進行查看具體的監控,代碼以下;
@Bean public ServletRegistrationBean druidServletRegistrationBean() { ServletRegistrationBean<Servlet> servletServletRegistrationBean = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");; Map<String, String> initParam = new HashMap<>(); //後臺容許誰能夠訪問 initParam.put("loginUsername", "admin"); initParam.put("loginPassword", "123456"); initParam.put("allow", ""); servletServletRegistrationBean.setInitParameters(initParam); return servletServletRegistrationBean; } // 配置 Druid 監控 之 web 監控的 filter // WebStatFilter:用於配置Web和Druid數據源之間的管理關聯監控統計 @Bean public FilterRegistrationBean webStatFilter() { FilterRegistrationBean bean = new FilterRegistrationBean(); bean.setFilter(new WebStatFilter()); Map<String, String> initParams = new HashMap<>(); initParams.put("exclusions", "*.js,*.css,/druid/*"); bean.setInitParameters(initParams); //"/*" 表示過濾全部請求 bean.setUrlPatterns(Arrays.asList("/*")); return bean; }
啓動項目,而後訪問 localhost:8080/druid/ 就會進入 Druid 的監控界面,界面以下:
到此 Spring 整合 Druid 就完成了。