什么是數據源?
JDBC2.0提供了javax.sql.DataSource接口,它負責建立與數據庫的連接,當在應用程序中訪問數據庫時,不必編寫連接數據庫的代碼,直接引用DataSource獲取數據庫的連接對象即可。用於獲取操作數據的Connection對象。
什么是數據庫連接池?
數據庫連接池的思想就是為數據庫連接建立一個“緩沖池”。預先在緩沖池中放入一定數量的連接,當需要建立數據庫連接時,只需從“緩沖池”中取出一個,使用完畢之后再放回去。可通過設定連接池的最大連接數來防止系統無盡的與數據庫連接。更重要的是我們可以通過連接池的管理機制監視數據庫的連接的數量、使用情況,為系統開發、測試以及性能調整提供依據。
數據源和數據庫連接池的關系?
數據源建立多個數據庫連接,這些數據庫連接將會保存在數據庫連接池中,當需要訪問數據庫時,只需要從數據庫連接池中獲取空閑的數據庫連接,當程序訪問數據庫結束時,數據庫連接會放回數據庫連接池中。
為什么要使用數據庫連接池?
傳統的JDBC訪問數據庫技術,每次訪問數據庫都需要通過數據庫驅動器Driver和數據庫名稱以及密碼等等資源建立數據庫連接。
如此就會存在兩大問題:
- 頻繁的建立與斷開數據庫連接,會降低執行效率,增加系統資源的開銷。
- 數據庫的連接需要用戶名和密碼等資源,這些也需要一定的內存和CPU的開銷。
而數據庫連接池很好地解決了這些問題。
JAVA常用的數據庫連接池?
Druid、DBCP、C3P0、BoneCP、Proxool、DDConnectionBroker、DBPool、XAPool、Primrose、SmartPool、MiniConnectionPoolManager等
Druid連接池
概念
Druid是目前最好的數據庫連接池,在功能、性能、擴展性方面,都遠超其他數據庫連接池,
組成
Druid是一個JDBC組件,它包括三個部分:
- 基於Filter-Chain模式的插件體系。
- DruidDataSource高效可管理的數據庫連接池。
- SQLParser
功能
- 替換DBCP和C3P0。Druid提供了一個高效、功能強大、可擴展性好的數據庫連接池。
- 可以監控數據庫訪問性能,Druid內置提供了一個功能強大的StatFilter插件,能夠詳細統計SQL的執行性能,這對於線上分析數據庫訪問性能有幫助。
- 數據庫密碼加密。直接把數據庫密碼寫在配置文件中,這是不好的行為,容易導致安全問題。DruidDruiver和DruidDataSource都支持PasswordCallback。
- SQL執行日志。Druid提供了不同的LogFilter,能夠支持Common-Logging、Log4j和JdkLog,你可以按需要選擇相應的LogFilter,監控你應用的數據庫訪問情況。
- 擴展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 }
測試界面