DataSource数据源
| 上一篇 | 主目錄 | 下一篇 |
目錄
- 1 基本概念
- 1.1 數(shù)據(jù)源DataSource、連接池
- 1.2 連接池思想
- 2 數(shù)連接池分類
- 2.1 Hikari連接池
- 2.2 阿里druid
【前言】
我們?cè)谶M(jìn)行數(shù)據(jù)訪問都需要配置數(shù)據(jù)源用來連接數(shù)據(jù)庫。數(shù)據(jù)源又可以分為兩大類:直連的數(shù)據(jù)源 和 連接池的數(shù)據(jù)源 ,其中連接池的數(shù)據(jù)源又有多種。
1 基本概念
1.1 數(shù)據(jù)源DataSource、連接池
DataSource通常被稱為數(shù)據(jù)源,它包含連接池 和連接池管理 兩部分,習(xí)慣上也經(jīng)常把DataSource稱為連接池。
Java中的數(shù)據(jù)源就是連接到數(shù)據(jù)庫的一條路徑,數(shù)據(jù)源中并無真正的數(shù)據(jù),它僅僅記錄的是你連接到哪個(gè)數(shù)據(jù)庫,以及如何連接。
1.2 連接池思想
在系統(tǒng)初始化的時(shí)候,將數(shù)據(jù)庫連接對(duì)象(Connection) 存儲(chǔ)在內(nèi)存中,當(dāng)用戶需要訪問數(shù)據(jù)庫時(shí)候,并不是建立一個(gè)新的連接,而是從連接池中取出一個(gè)已經(jīng)建立好的空閑連接對(duì)象。而連接池負(fù)責(zé)分配、管理、釋放數(shù)據(jù)庫連接對(duì)象。注意的是:連接池是由容器(比如tomcat) 提供的,同時(shí)容器也管理著連接池。
2 數(shù)連接池分類
數(shù)據(jù)庫連接池有C3P0、Tomcat、BoneCP、Hikari以及阿里的druid等。HikariCP 的性能比 Druid 高,但是因?yàn)?Druid 包括很多維度的統(tǒng)計(jì)和分析功能。以下介紹:
2.1 Hikari連接池
HikariCP(HikariCP:Hikari Connection Pool):Hikari日文中是“光”的意思,寓意著飛快。同時(shí)也是一個(gè)可靠連接池
數(shù)據(jù)連接配置:
2.2 阿里druid
Druid是阿里巴巴開源的一個(gè)數(shù)據(jù)源,主要用于java數(shù)據(jù)庫連接池。官方參考文檔
使用方法:
(1) 添加Druid依賴
(2) 添加application.properties配置
springboot支持yml和properties等配置文件,本文采用application.properties配置。
druid-monitor.properties
#是否啟用StatFilter默認(rèn)值true spring.datasource.druid.web-stat-filter.enabled=true #多個(gè)白名單IP以逗號(hào)分隔 druid.monitor.allow=127.0.0.1 #多個(gè)黑名單IP以逗號(hào)分隔 druid.monitor.deny=0.0.0.0 #druid監(jiān)控管理界面登錄帳號(hào) druid.monitor.loginUsername=admin #druid監(jiān)控管理界面登錄密碼 druid.monitor.loginPassword=password #是否開啟重置功能 druid.monitor.resetEnable=false(3) 添加配置類
為方便以后拓展,這里提供一個(gè)數(shù)據(jù)源配置接口,druid配置也只是這個(gè)接口的一個(gè)實(shí)現(xiàn)類,方便以后切換不同的數(shù)據(jù)源;
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 {/*** 定義數(shù)據(jù)源** @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配置實(shí)現(xiàn)類
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;/*** 指明是否在從池中取出連接前進(jìn)行檢驗(yàn),如果檢驗(yàn)失敗,則從池中去除連接并嘗試取出另一個(gè).<br/>* 注意: 設(shè)置為true后如果要生效,validationQuery參數(shù)必須設(shè)置為非空字符串*/@Value("${spring.datasource.testOnBorrow:true}")private boolean testOnBorrow;/*** 指明是否在歸還到池中前進(jìn)行檢驗(yàn)<br/>* 注意: 設(shè)置為true后如果要生效,validationQuery參數(shù)必須設(shè)置為非空字符串*/@Value("${spring.datasource.testOnReturn:false}")private boolean testOnReturn;@Value("${spring.datasource.minEvictableIdleTimeMillis:300000}")private int minEvictableIdleTimeMillis;/*** 當(dāng)開啟時(shí), 將為每個(gè)連接創(chuàng)建一個(gè)statement池,并且被方法創(chuàng)建的PreparedStatements將被緩存起來:*/@Value("${spring.datasource.poolPreparedStatements:false}")private boolean poolPreparedStatements;/*** 不限制 statement池能夠同時(shí)分配的打開的statements的最大數(shù)量,如果設(shè)置為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;/*** 當(dāng)建立新連接時(shí)被發(fā)送給JDBC驅(qū)動(dòng)的連接參數(shù)*/@Value("${spring.datasource.connectionProperties:druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000}")private String connectionProperties;/*** 定義數(shù)據(jù)源* 注意@Primary注解表示:自動(dòng)裝配時(shí)當(dāng)出現(xiàn)多個(gè)Bean候選者時(shí),被注解為@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的意思是合格者,通過這個(gè)標(biāo)示,表明了哪個(gè)實(shí)現(xiàn)類才是我們所需要的,* 我們修改調(diào)用代碼,添加@Qualifier注解,需要注意的是@Qualifier的參數(shù)名稱必須為我們之前定義@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();}/*** 定義事務(wù)管理器** @param dataSource* @return*/@Bean(name = "transactionManager")@Overridepublic DataSourceTransactionManager transactionManager(@Qualifier("dataSource") DataSource dataSource) {return new DataSourceTransactionManager(dataSource);} }我們配置了Druid的監(jiān)聽器
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;} }如何查看監(jiān)控頁面?
訪問http://localhost:8010/druid就可以了
本節(jié)摘自:https://www.jianshu.com/p/4dc18f5bee47(如有侵權(quán),請(qǐng)聯(lián)系刪除)
總結(jié)
以上是生活随笔為你收集整理的DataSource数据源的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux系统和内核目录解析
- 下一篇: 4.Rabbits and Recurr