數據源(DataSource)是什么


數據源

數據源,簡單理解為數據源頭,提供了應用程序所需要數據的位置。數據源保證了應用程序與目標數據之間交互的規范和協議,它可以是數據庫,文件系統等等。其中數據源定義了位置信息,用戶驗證信息和交互時所需的一些特性的配置,同時它封裝了如何建立與數據源的連接,向外暴露獲取連接的接口。應用程序連接數據庫無需關注其底層是如何如何建立的,也就是說應用業務邏輯與連接數據庫操作是松耦合的。 以下只討論當數據源為數據庫的情況,且為Java環境下JDBC規范下的如何建立與數據庫的連接,其他情況類似。
DriverManager

JDBC(Java DataBase Connectivity, 簡稱JDBC)是Java中用於規范應用程序如何來訪問數據庫的應用程序接口(API),它提供了查詢和更新數據庫中數據的方法。
在基於Java的應用程序中,我們需要使用JDBC驅動程序與數據庫進行交互,其中最重要的一步就是獲取與數據庫的連接。在傳統的JDBC時代,我們通常寫一個通用的方法來封裝與數據庫的建立操作:
` public Connection getConnection() throws SQLException {

    Connection conn = null;
    Properties connectionProps = new Properties();
    connectionProps.put("user", this.userName);
    connectionProps.put("password", this.password);
    //獲取獲取連接
    conn = DriverManager.getConnection(
               "jdbc:" + this.dbms + "://" +
               this.serverName +
               ":" + this.portNumber + "/",
               connectionProps);
    return conn;
}`

以上的代碼對於早些的程序員是再熟悉不過了,我們利用驅動管理器為應用程序提供數據庫連接,雖然使用形式簡單,但有個很大的問題就是:程序員需要自己去寫建立連接的操作,且該方法已經與我們的應用程序是緊耦合的,在后續需要更改數據庫時,需要程序員手動修改這里。在面對多數據源的情況下,該方法可能變成了簡單工廠模式那種慵懶的樣子,不符合設計模式中“對修改關閉,對擴展開放”的原則。
數據源

數據源是對數據庫以及對數據庫交互操作的抽象,它封裝了目標源的位置信息,驗證信息和建立與關閉連接的操作。數據源可以看做程序中一個組件,它把傳統中需要在代碼里編寫配置信息和獲取連接等操作抽象出一個規范或者接口,這樣不同的第三方可以自行實現該接口提供不同的策略。這樣,數據源就是對應用程序是透明的,開發者只需為應用程序配置特定的數據源即可與數據庫進行連接等操作。當需要更換數據庫服務器或者更換數據庫種類時,只需修改配置中信息即可,無需修改程序代碼。
數據源大致分為2種:不提供連接池和提供連接池管理。
不提供連接池的數據源

Spring中提供的數據源就是不提供連接池功能的,比如DriverManagerDataSource。該數據源對於應用程序的每一個連接請求都建立新的連接,當應用程序使用完畢后,再執行銷毀操作。當與數據庫交互頻繁時,這種模式會嚴重影響程序的性能。時間和空間消耗大多數消耗在連接和銷毀中,而非數據庫處理。所以Spring建議我們僅在測試中使用該數據源。以下為原話:

Only use the DriverManagerDataSource class should only be used for testing purposes since it does not provide pooling and will perform poorly when multiple requests for a connection are made.
提供連接池的數據源

提供連接池的數據源則是第三方提供的,比較流行的有Apache Jakarta Commons DBCP and C3P0。Spring中並不提供帶池化管理的數據源,它的目的在於集成市面上優秀的數據源組件。這里,提個插曲,Spring的口號就是不與市場上優秀的第三方組件競爭,而是以包容的心態為他們提供平台,方便開發者使用它們。
連接池是一種創建和管理一組連接對象的技術,這些連接對象可供任何需要它的線程使用。連接池可以極大地提高Java應用程序的性能,避免了創建新的連接實例時所必需的初始化和認證時間,同時減少整體資源使用,可以大大提高並發web的響應速度。這種數據源會在初始化的時候根據用戶配置建立一組連接。當應用程序與數據庫交互時,就可以快速從連接池中選擇一個空閑的連接使用;當使用完畢,把該連接歸還給連接池即可。
配置

這里僅僅展示一下如何配置C3P0 數據源。
xml配置

在類路徑下的spring中配置文件中,加入以下代碼即可,其中jdbc.properties則是一些配置信息。
`




<context:property-placeholder location="jdbc.properties"/>`

數據源在SpringBoot中的使用
們知道SpringBoot中是約定優於配置,springboot提供了很多自動化配置的操作,大大簡化了開發者在配置上花費的時間。比如數據源,基於版本2.1.0,SpringBoot采用以下算法來自動化配置數據源:

  1. 我們更喜歡HikariCP的性能和並發性。 如果HikariCP可用,我們總是選擇它。
  2. 否則,如果Tomcat池化DataSource可用,我們將使用它。
  3. 如果HikariCP和Tomcat池化數據源都不可用,並且Commons DBCP2可用,我們就會使用它。

以上都是在沒有顯示配置數據源的情況進行的步驟,若手動顯示配置了指定數據源,則以上步驟失效。

一般情況下,springboot都是采用HikariCP來作為默認的數據源。
那么如何更改默認的數據源呢?
如果我們想定義特定的數據源,簡單的方法就是直接在application.properties指定:
//指定使用c3p0, 當然你需要添加該數據源的依賴包,因為springboot不默認提供 spring.datasource.type=com.mchange.v2.c3p0.ComboPooledDataSource
如果遇到
Loading class com.mysql.jdbc.Driver. This is deprecated. The new driver class is com.mysql.cj.jdbc.Driver. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
是因為com.mysql.jdbc.Driver已經被廢棄,要使用新的jdbc驅動程序:com.mysql.cj.jdbc.Driver,並且該驅動可以被自動加載,手動加載是沒必要的。所以我們的application.properties無需在為mysql指定驅動類了。 以上可以在JDBC官方文檔找到答案:
When this class first attempts to establish a connection, it automatically loads any JDBC 4.0 drivers found within the class path. Note that your application must manually load any JDBC drivers prior to version 4.0.
https://blog.csdn.net/dawn_after_dark/article/details/81539761


免責聲明!

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



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