日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

DataSource数据源

發布時間:2023/12/20 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 DataSource数据源 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
MySQL專欄
上一篇主目錄 下一篇

目錄

    • 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日文中是“光”的意思,寓意著飛快。同時也是一個可靠連接池
數據連接配置:

<!-- Hikari Datasource --><bean id="dataSourceHikari" class="com.zaxxer.hikari.HikariDataSource" destroy-method="shutdown"><!-- <property name="driverClassName" value="${db.driverClass}" /> --> <!-- 無需指定,除非系統無法自動識別 --><property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8" /><property name="username" value="${db.username}" /><property name="password" value="${db.password}" /><!-- 連接只讀數據庫時配置為true, 保證安全 --><property name="readOnly" value="false" /><!-- 等待連接池分配連接的最大時長(毫秒),超過這個時長還沒可用的連接則發生SQLException, 缺省:30秒 --><property name="connectionTimeout" value="30000" /><!-- 一個連接idle狀態的最大時長(毫秒),超時則被釋放(retired),缺省:10分鐘 --><property name="idleTimeout" value="600000" /><!-- 一個連接的生命時長(毫秒),超時而且沒被使用則被釋放(retired),缺省:30分鐘,建議設置比數據庫超時時長少30秒,參考MySQL wait_timeout參數(show variables like '%timeout%';) --><property name="maxLifetime" value="1800000" /><!-- 連接池中允許的最大連接數。缺省值:10;推薦的公式:((core_count * 2) + effective_spindle_count) --><property name="maximumPoolSize" value="15" /></bean>

2.2 阿里druid

Druid是阿里巴巴開源的一個數據源,主要用于java數據庫連接池。官方參考文檔

使用方法:
(1) 添加Druid依賴

<properties><druid-version>1.1.10</druid-version></properties><dependencies> ...... <!--alibaba druid datasource--> <dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>${alibaba-druid.version}</version> </dependency> ......</dependencies>

(2) 添加application.properties配置
springboot支持yml和properties等配置文件,本文采用application.properties配置。

# DataSource settings spring.datasource.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.url = jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF8 spring.datasource.username = root spring.datasource.password = root spring.datasource.driverClassName = com.mysql.jdbc.Driver #連接池的配置信息 spring.datasource.initialSize=5 spring.datasource.minIdle=5 spring.datasource.maxActive=20 # 配置獲取連接等待超時的時間 spring.datasource.maxWait=60000 # 配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒 spring.datasource.timeBetweenEvictionRunsMillis=60000 # 配置一個連接在池中最小生存的時間,單位是毫秒 spring.datasource.minEvictableIdleTimeMillis=300000 spring.datasource.validationQuery=SELECT 1 FROM DUAL spring.datasource.testWhileIdle=true spring.datasource.testOnBorrow=false spring.datasource.testOnReturn=false # 打開PSCache,并且指定每個連接上PSCache的大小 spring.datasource.poolPreparedStatements=true spring.datasource.maxPoolPreparedStatementPerConnectionSize=20 # 配置監控統計攔截的filters,去掉后監控界面sql無法統計,'wall'用于防火墻 spring.datasource.filters=stat,wall,log4j # 通過connectProperties屬性來打開mergeSql功能;慢SQL記錄 spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000

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数据源的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。