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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

springboot DataSource

發(fā)布時(shí)間:2023/12/20 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 springboot DataSource 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

springboot提供了很多的自動(dòng)配置,借助其內(nèi)部的實(shí)現(xiàn)機(jī)制,我們?cè)谑褂靡恍┠K時(shí)只需要簡(jiǎn)單的依賴引入即可實(shí)現(xiàn)相關(guān)功能的注入與切換。在web開發(fā)過(guò)程中,與數(shù)據(jù)庫(kù)經(jīng)常會(huì)有聯(lián)系,同樣在springboot中對(duì)數(shù)據(jù)源(DataSource)也提供了相應(yīng)的處理流程來(lái)方便開發(fā)者。下面會(huì)從幾個(gè)方面做簡(jiǎn)單的說(shuō)明,作為學(xué)習(xí)的記錄:

  • 說(shuō)明

此次分析的springboot版本為?2.2.0.RELEASE,不同版本在一些方面會(huì)存在一定的差異,比如現(xiàn)在在默認(rèn)的數(shù)據(jù)源為hikari。

  • 簡(jiǎn)介

此版本中內(nèi)置了3個(gè)數(shù)據(jù)源的創(chuàng)建邏輯,分別為:

com.zaxxer.hikari.HikariDataSource, org.apache.tomcat.jdbc.pool.DataSource org.apache.commons.dbcp2.BasicDataSource
  • 源碼

想知道springboot自動(dòng)配置的入口,無(wú)疑需要從spring-boot-autoconfigure/META-INF/spring.factories開始,搜索下關(guān)鍵字DataSource,可以 看到引入了 org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,那么這就是數(shù)據(jù)源自動(dòng)配置。

@Configuration(proxyBeanMethods = false) @ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class }) @EnableConfigurationProperties(DataSourceProperties.class) @Import({ DataSourcePoolMetadataProvidersConfiguration.class, DataSourceInitializationConfiguration.class }) public class DataSourceAutoConfiguration {@Configuration(proxyBeanMethods = false)@Conditional(EmbeddedDatabaseCondition.class)@ConditionalOnMissingBean({ DataSource.class, XADataSource.class })@Import(EmbeddedDataSourceConfiguration.class)protected static class EmbeddedDatabaseConfiguration {}@Configuration(proxyBeanMethods = false)@Conditional(PooledDataSourceCondition.class)@ConditionalOnMissingBean({ DataSource.class, XADataSource.class })@Import({ DataSourceConfiguration.Hikari.class, DataSourceConfiguration.Tomcat.class,DataSourceConfiguration.Dbcp2.class, DataSourceConfiguration.Generic.class,DataSourceJmxConfiguration.class })protected static class PooledDataSourceConfiguration {}....一些Conditional...}

相對(duì)與其他模塊,代碼非常的少,我們可以關(guān)注兩點(diǎn),一是@Import,二是里面的內(nèi)容,

  • @Import分別引入 DataSourcePoolMetadataProvidersConfiguration,DataSourceInitializationConfigurationDataSourcePoolMetadataProvidersConfiguration:主要將數(shù)據(jù)源包裝成DataSourcePoolMetadataProvider對(duì)象,具體什么用可以注入看下其提供的功能DataSourceInitializationConfiguration:數(shù)據(jù)庫(kù)創(chuàng)建完成后由DataSourceInitializerInvoker執(zhí)行的一些初始化語(yǔ)句也就是配置文件中的spring.datasource.schema、spring.datasource.data,分別對(duì)應(yīng)了ddl、dml語(yǔ)句;另一個(gè)作用就是注冊(cè)了一個(gè)BeanPostProcessor,DataSourceInitializerPostProcessor(主要作用是DataSource注入后,DataSourceInitializerInvoker能載入到IOC)
  • 代碼中主要是通過(guò)@Conditional選擇數(shù)據(jù)源類型EmbeddedDatabase,PooledDataSource+ DataSource:普通的數(shù)據(jù)源+ EmbeddedDatabaseType:嵌入式數(shù)據(jù)庫(kù),可以不用單獨(dú)啟用數(shù)據(jù)庫(kù)服務(wù)器,H2,hsql,derby
  • 一般情況我們用的比較多的是PooledDataSource:

    @Configuration(proxyBeanMethods = false)@Conditional(PooledDataSourceCondition.class)@ConditionalOnMissingBean({ DataSource.class, XADataSource.class })@Import({ DataSourceConfiguration.Hikari.class, DataSourceConfiguration.Tomcat.class,DataSourceConfiguration.Dbcp2.class, DataSourceConfiguration.Generic.class,DataSourceJmxConfiguration.class })protected static class PooledDataSourceConfiguration {}

    可以看到,這里定義了之前說(shuō)到的幾種數(shù)據(jù)源配置,以Hikari為例,看下創(chuàng)建過(guò)程:

    @Configuration(proxyBeanMethods = false)@ConditionalOnClass(HikariDataSource.class)@ConditionalOnMissingBean(DataSource.class)@ConditionalOnProperty(name = "spring.datasource.type", havingValue = "com.zaxxer.hikari.HikariDataSource",matchIfMissing = true)static class Hikari {@Bean@ConfigurationProperties(prefix = "spring.datasource.hikari")HikariDataSource dataSource(DataSourceProperties properties) {HikariDataSource dataSource = createDataSource(properties, HikariDataSource.class);if (StringUtils.hasText(properties.getName())) {dataSource.setPoolName(properties.getName());}return dataSource;}} protected static <T> T createDataSource(DataSourceProperties properties, Class<? extends DataSource> type) {return (T) properties.initializeDataSourceBuilder().type(type).build();} public DataSourceBuilder<?> initializeDataSourceBuilder() {return DataSourceBuilder.create(getClassLoader()).type(getType()).driverClassName(determineDriverClassName()).url(determineUrl()).username(determineUsername()).password(determinePassword());}

    可見,最終的創(chuàng)建過(guò)程都是在DataSourceBuilder#build中完成。

    • 分析

    上面說(shuō)到,在DataSourceBuilder中完成了DataSource的創(chuàng)建工作,但是此時(shí)的數(shù)據(jù)源只有基礎(chǔ)的一些參數(shù),比如url、driverClass等,在使用數(shù)據(jù)庫(kù)連接池時(shí),絕非這么些參數(shù),此時(shí)是如何配置進(jìn)去的?

    回到剛Hikari的配置上,

    @Bean @ConfigurationProperties(prefix = "spring.datasource.hikari")

    同時(shí)結(jié)合application.properties中的配置,發(fā)現(xiàn)會(huì)有spring.datasource.xxx與spring.datasource.hikari.xxx,其區(qū)別在于使用前者時(shí),會(huì)根據(jù)基礎(chǔ)的參數(shù)創(chuàng)建數(shù)據(jù)源,但是在DataSource的生命周期中,會(huì)將后者的值注入到DataSource bean中從而完成DataSource的屬性注入,那么上面說(shuō)到的連接池相關(guān)的配置,也是從這里加進(jìn)去的。

    所有我們?cè)谂渲脭?shù)據(jù)源時(shí),不要使用spring.datasource.xxx,否則數(shù)據(jù)庫(kù)連接池將會(huì)使用默認(rèn)的配置。

    • 示例

    下面以阿里的druid數(shù)據(jù)源為例,

    1、引入依賴jar

    <dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.18</version> </dependency>

    2、加入配置

    spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.druid.url=jdbc:mysql://localhost:3306/test?characterEncoding=utf-8&useUnicode=true&useSSL=false&serverTimezone=UTC spring.datasource.druid.username=root spring.datasource.druid.password=123456 spring.datasource.druid.filters=stat spring.datasource.druid.minIdle=5

    3、定義DataSource

    @Configuration public class DruidDatasource {@ConfigurationProperties(prefix = "spring.datasource.druid")@Beanpublic DataSource druidDataSource(){return DataSourceBuilder.create().type(DruidDataSource.class).build();} }

    ?

    總結(jié)

    以上是生活随笔為你收集整理的springboot DataSource的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。