更新時間:2022-12-07 11:14:07 來源:動力節點 瀏覽1669次
Java數據源是什么?動力節點小編來告訴大家。
數據源,簡單理解為數據源頭,提供了應用程序所需要數據的位置。數據源保證了應用程序與目標數據之間交互的規范和協議,它可以是數據庫,文件系統等等。其中數據源定義了位置信息,用戶驗證信息和交互時所需的一些特性的配置,同時它封裝了如何建立與數據源的連接,向外暴露獲取連接的接口。應用程序連接數據庫無需關注其底層是如何如何建立的,也就是說應用業務邏輯與連接數據庫操作是松耦合的。 以下只討論當數據源為數據庫的情況,且為Java環境下JDBC規范下的如何建立與數據庫的連接,其他情況類似。
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則是一些配置信息。
當然也可以通過Java代碼來配置,使用Spring的注解@Configuration來定義配置類,這樣在IOC容器初始化時會實例化該數據源。
package com.specialyang.questionanswer.config;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import com.mchange.v2.c3p0.jboss.C3P0PooledDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
import java.beans.PropertyVetoException;
/**
* Created by Special on 2018/8/9 15:32
*/
@Configuration
public class DataSourceConfiguration{
@Bean
public DataSource dataSource() throws PropertyVetoException{
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setDriverClass( "org.postgresql.Driver" ); //loads the jdbc driver
dataSource.setJdbcUrl( "jdbc:postgresql://localhost/testdb" );
dataSource.setUser("swaldman");
dataSource.setPassword("test-password");
return dataSource;
}
}
我們知道SpringBoot中是約定優于配置,springboot提供了很多自動化配置的操作,大大簡化了開發者在配置上花費的時間。比如數據源,基于版本2.1.0,SpringBoot采用以下算法來自動化配置數據源:
我們更喜歡HikariCP的性能和并發性。 如果HikariCP可用,我們總是選擇它。
否則,如果Tomcat池化DataSource可用,我們將使用它。
如果HikariCP和Tomcat池化數據源都不可用,并且Commons DBCP2可用,我們就會使用它。
以上都是在沒有顯示配置數據源的情況進行的步驟,若手動顯示配置了指定數據源,則以上步驟失效。
一般情況下,springboot都是采用HikariCP來作為默認的數據源。
如果我們想定義特定的數據源,一種簡單的方法就是直接在application.properties指定:
//指定使用c3p0, 當然你需要添加該數據源的依賴包,因為springboot不默認提供
spring.datasource.type=com.mchange.v2.c3p0.ComboPooledDataSource
另一種就是使用上面寫的配置類。
通過上述介紹,相信大家對Java數據源已經有所了解,大家如果想了解更多相關知識,不妨來關注一下本站的Java在線學習技術文檔,里面的課程內容從入門到精通,細致全面,很適合沒有基礎的小伙伴學習,希望對大家能夠有所幫助。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習