DataSource数据源
| 上一篇 | 主目錄 | 下一篇 |
目錄
- 1 基本概念
- 1.1 數據源DataSource、連接池
- 1.2 連接池思想
- 2 數連接池分類
- 2.1 Hikari連接池
- 2.2 阿里druid
【前言】
我們在進行數據訪問都需要配置數據源用來連接數據庫。數據源又可以分為兩大類:直連的數據源 和 連接池的數據源 ,其中連接池的數據源又有多種。
1 基本概念
1.1 數據源DataSource、連接池
DataSource通常被稱為數據源,它包含連接池 和連接池管理 兩部分,習慣上也經常把DataSource稱為連接池。
Java中的數據源就是連接到數據庫的一條路徑,數據源中并無真正的數據,它僅僅記錄的是你連接到哪個數據庫,以及如何連接。
1.2 連接池思想
在系統初始化的時候,將數據庫連接對象(Connection) 存儲在內存中,當用戶需要訪問數據庫時候,并不是建立一個新的連接,而是從連接池中取出一個已經建立好的空閑連接對象。而連接池負責分配、管理、釋放數據庫連接對象。注意的是:連接池是由容器(比如tomcat) 提供的,同時容器也管理著連接池。
2 數連接池分類
數據庫連接池有C3P0、Tomcat、BoneCP、Hikari以及阿里的druid等。HikariCP 的性能比 Druid 高,但是因為 Druid 包括很多維度的統計和分析功能。以下介紹:
2.1 Hikari連接池
HikariCP(HikariCP:Hikari Connection Pool):Hikari日文中是“光”的意思,寓意著飛快。同時也是一個可靠連接池
數據連接配置:
2.2 阿里druid
Druid是阿里巴巴開源的一個數據源,主要用于java數據庫連接池。官方參考文檔
使用方法:
(1) 添加Druid依賴
(2) 添加application.properties配置
springboot支持yml和properties等配置文件,本文采用application.properties配置。
druid-monitor.properties
#是否啟用StatFilter默認值true spring.datasource.druid.web-stat-filter.enabled=true #多個白名單IP以逗號分隔 druid.monitor.allow=127.0.0.1 #多個黑名單IP以逗號分隔 druid.monitor.deny=0.0.0.0 #druid監控管理界面登錄帳號 druid.monitor.loginUsername=admin #druid監控管理界面登錄密碼 druid.monitor.loginPassword=password #是否開啟重置功能 druid.monitor.resetEnable=false(3) 添加配置類
為方便以后拓展,這里提供一個數據源配置接口,druid配置也只是這個接口的一個實現類,方便以后切換不同的數據源;
DbConfig.java
package com.ijustone.service.core.db.config; import org.apache.ibatis.session.SqlSessionFactory; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import javax.sql.DataSource; public interface DbConfig {/*** 定義數據源** @return* @throws Exception*/DataSource dataSource() throws Exception;/*** 定義session工廠** @param dataSource* @return* @throws Exception*/SqlSessionFactory sessionFactory(DataSource dataSource) throws Exception;/*** 定義失誤管理器** @param dataSource* @return*/DataSourceTransactionManager transactionManager(DataSource dataSource);}下面是druid配置實現類
MyDruirdConfig.java
package com.ijustone.service.core.db.config.impl;import com.alibaba.druid.pool.DruidDataSource; import com.ijustone.service.core.db.config.DbConfig; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement;import javax.sql.DataSource;/*** @author JustOne* @create 2018-08-01 22:47*/ @Configuration @EnableTransactionManagement @MapperScan(basePackages = MyDruirdConfig.PACKAGE, sqlSessionFactoryRef = "sessionFactory") public class MyDruirdConfig implements DbConfig {public static final String PACKAGE = "com.ijustone.service.**.mapper";public static final String MAPPER = "classpath:com/ijustone/service/**/mapper/**/*Mapper.xml";@Value("${spring.datasource.url}")private String dbUrl;@Value("${spring.datasource.username}")private String username;@Value("${spring.datasource.password}")private String password;@Value("${spring.datasource.driverClassName}")private String driverClassName;@Value("${spring.datasource.initialSize}")private int initialSize;@Value("${spring.datasource.minIdle}")private int minIdle;@Value("${spring.datasource.maxActive}")private int maxActive;@Value("${spring.datasource.maxWait}")private int maxWait;@Value("${spring.datasource.testWhileIdle:true}")private boolean testWhileIdle;@Value("${spring.datasource.timeBetweenEvictionRunsMillis:60000}")private int timeBetweenEvictionRunsMillis;@Value("${spring.datasource.validationQuery}")private String validationQuery;/*** 指明是否在從池中取出連接前進行檢驗,如果檢驗失敗,則從池中去除連接并嘗試取出另一個.<br/>* 注意: 設置為true后如果要生效,validationQuery參數必須設置為非空字符串*/@Value("${spring.datasource.testOnBorrow:true}")private boolean testOnBorrow;/*** 指明是否在歸還到池中前進行檢驗<br/>* 注意: 設置為true后如果要生效,validationQuery參數必須設置為非空字符串*/@Value("${spring.datasource.testOnReturn:false}")private boolean testOnReturn;@Value("${spring.datasource.minEvictableIdleTimeMillis:300000}")private int minEvictableIdleTimeMillis;/*** 當開啟時, 將為每個連接創建一個statement池,并且被方法創建的PreparedStatements將被緩存起來:*/@Value("${spring.datasource.poolPreparedStatements:false}")private boolean poolPreparedStatements;/*** 不限制 statement池能夠同時分配的打開的statements的最大數量,如果設置為0表示不限制*/@Value("${spring.datasource.maxOpenPreparedStatements:10}")private int maxPoolPreparedStatementPerConnectionSize;@Value("${spring.datasource.defaultAutoCommit:false}")private boolean defaultAutoCommit;@Value("${spring.datasource.filters:stat}")private String filters;/*** 當建立新連接時被發送給JDBC驅動的連接參數*/@Value("${spring.datasource.connectionProperties:druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000}")private String connectionProperties;/*** 定義數據源* 注意@Primary注解表示:自動裝配時當出現多個Bean候選者時,被注解為@Primary的Bean將作為首選者,否則將拋出異常** @return* @throws Exception*/@Bean(name = "dataSource")@Primary@Overridepublic DataSource dataSource() throws Exception {DruidDataSource datasource = new DruidDataSource();datasource.setUrl(this.dbUrl);datasource.setUsername(this.username);datasource.setPassword(this.password);datasource.setDriverClassName(this.driverClassName);datasource.setInitialSize(this.initialSize);datasource.setMinIdle(this.minIdle);datasource.setMaxActive(this.maxActive);datasource.setMaxWait(this.maxWait);datasource.setTimeBetweenEvictionRunsMillis(this.timeBetweenEvictionRunsMillis);datasource.setMinEvictableIdleTimeMillis(this.minEvictableIdleTimeMillis);datasource.setValidationQuery(this.validationQuery);datasource.setTestWhileIdle(this.testWhileIdle);datasource.setTestOnBorrow(this.testOnBorrow);datasource.setTestOnReturn(this.testOnReturn);datasource.setPoolPreparedStatements(this.poolPreparedStatements);datasource.setMaxPoolPreparedStatementPerConnectionSize(this.maxPoolPreparedStatementPerConnectionSize);datasource.setDefaultAutoCommit(this.defaultAutoCommit);datasource.setFilters(this.filters);datasource.setConnectionProperties(this.connectionProperties);return datasource;}/*** 定義session工廠* 注:ualifier的意思是合格者,通過這個標示,表明了哪個實現類才是我們所需要的,* 我們修改調用代碼,添加@Qualifier注解,需要注意的是@Qualifier的參數名稱必須為我們之前定義@Service注解的名稱之一!** @param dataSource* @return* @throws Exception*/@Bean(name = "sessionFactory")@Primary@Overridepublic SqlSessionFactory sessionFactory(@Qualifier("dataSource") DataSource dataSource) throws Exception {SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();sessionFactory.setDataSource(dataSource);PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();sessionFactory.setMapperLocations(resolver.getResources(MyDruirdConfig.MAPPER));return sessionFactory.getObject();}/*** 定義事務管理器** @param dataSource* @return*/@Bean(name = "transactionManager")@Overridepublic DataSourceTransactionManager transactionManager(@Qualifier("dataSource") DataSource dataSource) {return new DataSourceTransactionManager(dataSource);} }我們配置了Druid的監聽器
DruidMonitorConfiguration.java
package com.ijustone.service.core.druid.monitor;import com.alibaba.druid.support.http.StatViewServlet; import com.alibaba.druid.support.http.WebStatFilter; import org.springframework.beans.factory.annotation.Value; 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 org.springframework.context.annotation.PropertySource;@Configuration @PropertySource(value = "classpath:config/druid-monitor.properties") @ConfigurationProperties public class DruidMonitorConfiguration {@Value("${druid.monitor.allow:127.0.0.1}")private String allow;@Value("${druid.monitor.deny}")private String deny;@Value("${druid.monitor.loginUsername:admin}")private String loginUsername;@Value("${druid.monitor.loginPassword:password}")private String loginPassword;@Value("${druid.monitor.resetEnable:false}")private String resetEnable;@Beanpublic ServletRegistrationBean druidStatViewServlet() {ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");servletRegistrationBean.addInitParameter("allow", this.allow);servletRegistrationBean.addInitParameter("deny", this.deny);servletRegistrationBean.addInitParameter("loginUsername", this.loginUsername);servletRegistrationBean.addInitParameter("loginPassword", this.loginPassword);servletRegistrationBean.addInitParameter("resetEnable", this.resetEnable);return servletRegistrationBean;}@Beanpublic FilterRegistrationBean druidStatFilter() {FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());filterRegistrationBean.addUrlPatterns("/*");filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");return filterRegistrationBean;} }如何查看監控頁面?
訪問http://localhost:8010/druid就可以了
本節摘自:https://www.jianshu.com/p/4dc18f5bee47(如有侵權,請聯系刪除)
總結
以上是生活随笔為你收集整理的DataSource数据源的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux系统和内核目录解析
- 下一篇: 4.Rabbits and Recurr