DataSource對象的理解


一、DataSource 對象

1. 什么是DataSource對象

DataSource對象是javax.sql包中的一個接口,其實就是可以標識為一個數據庫連接資源,數據源對象里面應該存儲連接的url,用戶名和密碼等連接信息。

在使用JDBC連接數據庫的時候,都使用通過DriverManager進行獲取Connection對象,getConnection方法都需要傳遞url,name.passwd等信息,其實這些信息就是可以充當一個數據源對象。

2. 數據源和數據連接池的區別

數據源就是一個數據的來源,相當於數據庫。但是程序去訪問數據庫並不直接訪問,會通過一個代理,也就是數據連接池,每一個數據連接池引用的對象肯定有數據源。DataSource的實現子類有很多,其中很多第三方的連接池都是需要實現DataSource的,如果創建一個帶數據池的數據源,則就有連接池功能了。

​ 比如:Mybatis就有默認的數據源實現類

  <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://172.23.23.166:3306/DB_ATY?characterEncoding=UTF-8&amp;allowMultiQueries=true"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>

在mybatis-config配置數據源的時候,就可以指定type為POOLED\UNPOOLED\JNDI

img

3. druid連接池

比如現在項目中使用的數據源連接池為:DruidDataSource。

Druid是阿里開源的數據庫連接池,性能比C3P0\DBCP更高,提供監控功能,可以監聽sql語句的執行時間、ResultSet持有時間、返回行數、更新行數、分析SQL的執行性能。

durid有如下參數用於來配置數據庫連接池信息。

  1. iniitialSize 初始化連接數,比如初始化10個連接
  2. minidle 最小連接數也10個,應該和初始化保持一致,如果初始化的時候要瘋狂連接數據庫則初始化的時候可以開大點
  3. maxActve 最大連接數,應該和最大並發量保持一致吧
  4. maxWait 應該盡量保持再一分鍾,不能太長,不讓給用戶不好的體驗
  5. validationQuery

現在一直不知道連接池的一些參數應該配置多少,有時間再去了解。

二、Spring是如何管理DataSource對象的

其實我理解的是,spring就將DataSource作為一個bean對象而且,你可以在spring項目中聲明多個datasource對象。管理的話主要還是得看spring如何跟mybatis等一些需要數據連接池的框架是如何進行交互。

  1. 在springboot中如何聲明一個DataSource對象?

    spring:
      datasource:
        type:xxx
        url:xxx
        username:xxx
        password:xxx
    

    直接在application.yml編寫這樣的聲明,springboot則會自動注入一個dataSource的bean對象,但是如果需要使用多數據源的話,則不能這樣寫,並且需要手動配置生成DataSource對象。

  2. 多數據源應該如何創建DataSource對象?

    @Bean(name = "dmDatasourceProperties")
    @Qualifier("dmDatasourceProperties")
    @Primary
    @ConfigurationProperties(prefix = "spring.datasource.xx")
    public DataSourceProperties xxDatasourceProperties() {
        return new DataSourceProperties();
    }

    @Bean(name = "xxDatasource")
    @Qualifier("xxDatasource")
    @Primary
    public DataSource xxDatasource() {
        return xxDatasourceProperties().initializeDataSourceBuilder().build();
    }

這樣就配置好了對應的name的數據源了

  1. jdbcTemplate選擇對應的數據庫源

比如使用JdbcTemplate,JdbcTemplate是一個已經封裝好的對象,但是一開始肯定沒有注入到spring容器中(如果有默認的數據庫源的話可能也注入進去了),應該創建JdbcTemplate對象注入到spring容器中,這個時候就需要一個DataSource數據源了。

  @Bean(name = "jdbcTemplate")
    public JdbcTemplate getJdbc(){
        JdbcTemplate jdbcTemplate = new JdbcTemplate();
        jdbcTemplate.setDataSource(xxDatasource());
        return jdbcTemplate;
    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM