數據源與數據庫連接池


什么是數據源?

JDBC2.0提供了javax.sql.DataSource接口,它負責建立與數據庫的連接,當在應用程序中訪問數據庫時,不必編寫連接數據庫的代碼,直接引用DataSource獲取數據庫的連接對象即可。用於獲取操作數據的Connection對象。

 

什么是數據庫連接池?

數據庫連接池的思想就是為數據庫連接建立一個“緩沖池”。預先在緩沖池中放入一定數量的連接,當需要建立數據庫連接時,只需從“緩沖池”中取出一個,使用完畢之后再放回去。可通過設定連接池的最大連接數來防止系統無盡的與數據庫連接。更重要的是我們可以通過連接池的管理機制監視數據庫的連接的數量、使用情況,為系統開發、測試以及性能調整提供依據。

 

數據源和數據庫連接池的關系?

數據源建立多個數據庫連接,這些數據庫連接將會保存在數據庫連接池中,當需要訪問數據庫時,只需要從數據庫連接池中獲取空閑的數據庫連接,當程序訪問數據庫結束時,數據庫連接會放回數據庫連接池中。

 

為什么要使用數據庫連接池?

傳統的JDBC訪問數據庫技術,每次訪問數據庫都需要通過數據庫驅動器Driver和數據庫名稱以及密碼等等資源建立數據庫連接。

如此就會存在兩大問題:

  1. 頻繁的建立與斷開數據庫連接,會降低執行效率,增加系統資源的開銷。
  2. 數據庫的連接需要用戶名和密碼等資源,這些也需要一定的內存和CPU的開銷。 

而數據庫連接池很好地解決了這些問題。

 

JAVA常用的數據庫連接池?

Druid、DBCP、C3P0、BoneCP、Proxool、DDConnectionBroker、DBPool、XAPool、Primrose、SmartPool、MiniConnectionPoolManager等

 

 Druid連接池

概念

Druid是目前最好的數據庫連接池,在功能、性能、擴展性方面,都遠超其他數據庫連接池,

組成

Druid是一個JDBC組件,它包括三個部分:

  1. 基於Filter-Chain模式的插件體系。
  2. DruidDataSource高效可管理的數據庫連接池。
  3. SQLParser

功能

  1. 替換DBCP和C3P0。Druid提供了一個高效、功能強大、可擴展性好的數據庫連接池。
  2. 可以監控數據庫訪問性能,Druid內置提供了一個功能強大的StatFilter插件,能夠詳細統計SQL的執行性能,這對於線上分析數據庫訪問性能有幫助。
  3. 數據庫密碼加密。直接把數據庫密碼寫在配置文件中,這是不好的行為,容易導致安全問題。DruidDruiver和DruidDataSource都支持PasswordCallback。
  4. SQL執行日志。Druid提供了不同的LogFilter,能夠支持Common-Logging、Log4j和JdkLog,你可以按需要選擇相應的LogFilter,監控你應用的數據庫訪問情況。
  5. 擴展JDBC。如果你要對JDBC層有編程的需求,可以通過Druid提供的Filter機制,很方便編寫JDBC層的擴展插件。

使用原因

原先項目使用的是C3P0連接池,在項目發布使用一段時間后發現c3p0 連接池訪問數據庫的時候創建連接會在oralce的lisenter.log 日志文件記錄。 

經過一段時間觀察發現oralce每6秒會在lisenter.log日志記錄一次,我們設置的最小連接是20,所以oracle每次會在日志記錄20條。隨着時間越長日志文件越來越大,當日志文件達到4個G的時候會導致oracle死掉。 經過不斷調整參數配置還是無法得到解決方案,最后選擇使用阿里Druid連接池試試,Druid默認最小連接2個,配置好后發布觀察日志發現只在創建的時候在日志里面記錄了2條記錄。沒有像C3P0那樣每6秒記錄一次導致日志文件越來越大。 

 

springboot集成druid連接池配置 (spring中使用druid的配置

pom.xml中需要引入的依賴

1         <dependency>
2             <groupId>com.alibaba</groupId>
3             <artifactId>druid-spring-boot-starter</artifactId>
4             <version>1.1.10</version>
5         </dependency>

application.yml需要添加的配置

 1 spring:
 2   datasource:
 3     type: com.alibaba.druid.pool.DruidDataSource
 4     driverClassName: com.mysql.cj.jdbc.Driver
 5     driver-class-name: com.mysql.cj.jdbc.Driver
 6     platform: mysql
 7     url: jdbc:mysql://127.0.0.1:3306/xxx?useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false
 8     username: root
 9     password: 123456
10     initialSize: 5
11     minIdle: 5
12     maxActive: 20
13     maxWait: 60000
14     timeBetweenEvictionRunsMillis: 60000
15     minEvictableIdleTimeMillis: 300000
16     validationQuery: SELECT1FROMDUAL
17     testWhileIdle: true
18     testOnBorrow: false
19     testOnReturn: false
20     filters: stat,wall,log4j
21     logSlowSql: true 

到此springboot就集成的druid的配置可以直接使用

springboot添加druid監控平台配置類

 1 import com.alibaba.druid.support.http.StatViewServlet;
 2 import com.alibaba.druid.support.http.WebStatFilter;
 3 import org.slf4j.Logger;
 4 import org.slf4j.LoggerFactory;
 5 import org.springframework.boot.web.servlet.FilterRegistrationBean;
 6 import org.springframework.boot.web.servlet.ServletRegistrationBean;
 7 import org.springframework.context.annotation.Bean;
 8 import org.springframework.context.annotation.Configuration;
 9 
10 /**
11  * 數據庫鏈接池druid監控平台的配置
12  * 訪問路徑 http://localhost:8080/druid/index.html
13  *
14  */
15 @Configuration
16 public class DruidConfiguration {
17 
18     private static final Logger logger = LoggerFactory.getLogger(DruidConfiguration.class);
19 
20     @Bean
21     public ServletRegistrationBean druidServlet() {
22         logger.info("init Druid Servlet Configuration ");
23         ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
24         // IP白名單
25 //        servletRegistrationBean.addInitParameter("allow", "*");
26         // IP黑名單(共同存在時,deny優先於allow)
27 //        servletRegistrationBean.addInitParameter("deny", "192.168.1.100");
28         //控制台管理用戶
29         servletRegistrationBean.addInitParameter("loginUsername", "admin");
30         servletRegistrationBean.addInitParameter("loginPassword", "admin");
31         //是否能夠重置數據 禁用HTML頁面上的“Reset All”功能
32         servletRegistrationBean.addInitParameter("resetEnable", "false");
33         return servletRegistrationBean;
34     }
35     @Bean
36     public FilterRegistrationBean filterRegistrationBean() {
37         FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());
38         filterRegistrationBean.addUrlPatterns("/*");
39         filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
40         return filterRegistrationBean;
41     }
42 }

測試界面

 

相關可學習的博客(進一步學習更深的知識):

1.數據庫連接池學習筆記(一):原理介紹+常用連接池介紹

2.數據庫連接池-常用參數配置及含義

3.三種數據庫連接池的配置


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM