更新時(shí)間:2022-12-07 11:14:07 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽2025次
Java數(shù)據(jù)源是什么?動(dòng)力節(jié)點(diǎn)小編來(lái)告訴大家。
數(shù)據(jù)源,簡(jiǎn)單理解為數(shù)據(jù)源頭,提供了應(yīng)用程序所需要數(shù)據(jù)的位置。數(shù)據(jù)源保證了應(yīng)用程序與目標(biāo)數(shù)據(jù)之間交互的規(guī)范和協(xié)議,它可以是數(shù)據(jù)庫(kù),文件系統(tǒng)等等。其中數(shù)據(jù)源定義了位置信息,用戶驗(yàn)證信息和交互時(shí)所需的一些特性的配置,同時(shí)它封裝了如何建立與數(shù)據(jù)源的連接,向外暴露獲取連接的接口。應(yīng)用程序連接數(shù)據(jù)庫(kù)無(wú)需關(guān)注其底層是如何如何建立的,也就是說(shuō)應(yīng)用業(yè)務(wù)邏輯與連接數(shù)據(jù)庫(kù)操作是松耦合的。 以下只討論當(dāng)數(shù)據(jù)源為數(shù)據(jù)庫(kù)的情況,且為Java環(huán)境下JDBC規(guī)范下的如何建立與數(shù)據(jù)庫(kù)的連接,其他情況類似。
JDBC(Java DataBase Connectivity, 簡(jiǎn)稱JDBC)是Java中用于規(guī)范應(yīng)用程序如何來(lái)訪問(wèn)數(shù)據(jù)庫(kù)的應(yīng)用程序接口(API),它提供了查詢和更新數(shù)據(jù)庫(kù)中數(shù)據(jù)的方法。
在基于Java的應(yīng)用程序中,我們需要使用JDBC驅(qū)動(dòng)程序與數(shù)據(jù)庫(kù)進(jìn)行交互,其中最重要的一步就是獲取與數(shù)據(jù)庫(kù)的連接。在傳統(tǒng)的JDBC時(shí)代,我們通常寫一個(gè)通用的方法來(lái)封裝與數(shù)據(jù)庫(kù)的建立操作:
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;
}
以上的代碼對(duì)于早些的程序員是再熟悉不過(guò)了,我們利用驅(qū)動(dòng)管理器為應(yīng)用程序提供數(shù)據(jù)庫(kù)連接,雖然使用形式簡(jiǎn)單,但有個(gè)很大的問(wèn)題就是:程序員需要自己去寫建立連接的操作,且該方法已經(jīng)與我們的應(yīng)用程序是緊耦合的,在后續(xù)需要更改數(shù)據(jù)庫(kù)時(shí),需要程序員手動(dòng)修改這里。在面對(duì)多數(shù)據(jù)源的情況下,該方法可能變成了簡(jiǎn)單工廠模式那種慵懶的樣子,不符合設(shè)計(jì)模式中“對(duì)修改關(guān)閉,對(duì)擴(kuò)展開(kāi)放”的原則。
數(shù)據(jù)源是對(duì)數(shù)據(jù)庫(kù)以及對(duì)數(shù)據(jù)庫(kù)交互操作的抽象,它封裝了目標(biāo)源的位置信息,驗(yàn)證信息和建立與關(guān)閉連接的操作。數(shù)據(jù)源可以看做程序中一個(gè)組件,它把傳統(tǒng)中需要在代碼里編寫配置信息和獲取連接等操作抽象出一個(gè)規(guī)范或者接口,這樣不同的第三方可以自行實(shí)現(xiàn)該接口提供不同的策略。這樣,數(shù)據(jù)源就是對(duì)應(yīng)用程序是透明的,開(kāi)發(fā)者只需為應(yīng)用程序配置特定的數(shù)據(jù)源即可與數(shù)據(jù)庫(kù)進(jìn)行連接等操作。當(dāng)需要更換數(shù)據(jù)庫(kù)服務(wù)器或者更換數(shù)據(jù)庫(kù)種類時(shí),只需修改配置中信息即可,無(wú)需修改程序代碼。
數(shù)據(jù)源大致分為2種:不提供連接池和提供連接池管理。
不提供連接池的數(shù)據(jù)源
Spring中提供的數(shù)據(jù)源就是不提供連接池功能的,比如DriverManagerDataSource。該數(shù)據(jù)源對(duì)于應(yīng)用程序的每一個(gè)連接請(qǐng)求都建立新的連接,當(dāng)應(yīng)用程序使用完畢后,再執(zhí)行銷毀操作。當(dāng)與數(shù)據(jù)庫(kù)交互頻繁時(shí),這種模式會(huì)嚴(yán)重影響程序的性能。時(shí)間和空間消耗大多數(shù)消耗在連接和銷毀中,而非數(shù)據(jù)庫(kù)處理。所以Spring建議我們僅在測(cè)試中使用該數(shù)據(jù)源。以下為原話:
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.
提供連接池的數(shù)據(jù)源
提供連接池的數(shù)據(jù)源則是第三方提供的,比較流行的有Apache Jakarta Commons DBCP and C3P0。Spring中并不提供帶池化管理的數(shù)據(jù)源,它的目的在于集成市面上優(yōu)秀的數(shù)據(jù)源組件。這里,提個(gè)插曲,Spring的口號(hào)就是不與市場(chǎng)上優(yōu)秀的第三方組件競(jìng)爭(zhēng),而是以包容的心態(tài)為他們提供平臺(tái),方便開(kāi)發(fā)者使用它們。
連接池是一種創(chuàng)建和管理一組連接對(duì)象的技術(shù),這些連接對(duì)象可供任何需要它的線程使用。連接池可以極大地提高Java應(yīng)用程序的性能,避免了創(chuàng)建新的連接實(shí)例時(shí)所必需的初始化和認(rèn)證時(shí)間,同時(shí)減少整體資源使用,可以大大提高并發(fā)web的響應(yīng)速度。這種數(shù)據(jù)源會(huì)在初始化的時(shí)候根據(jù)用戶配置建立一組連接。當(dāng)應(yīng)用程序與數(shù)據(jù)庫(kù)交互時(shí),就可以快速?gòu)倪B接池中選擇一個(gè)空閑的連接使用;當(dāng)使用完畢,把該連接歸還給連接池即可。
這里僅僅展示一下如何配置C3P0 數(shù)據(jù)源。
xml配置
在類路徑下的spring中配置文件中,加入以下代碼即可,其中jdbc.properties則是一些配置信息。
當(dāng)然也可以通過(guò)Java代碼來(lái)配置,使用Spring的注解@Configuration來(lái)定義配置類,這樣在IOC容器初始化時(shí)會(huì)實(shí)例化該數(shù)據(jù)源。
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中是約定優(yōu)于配置,springboot提供了很多自動(dòng)化配置的操作,大大簡(jiǎn)化了開(kāi)發(fā)者在配置上花費(fèi)的時(shí)間。比如數(shù)據(jù)源,基于版本2.1.0,SpringBoot采用以下算法來(lái)自動(dòng)化配置數(shù)據(jù)源:
我們更喜歡HikariCP的性能和并發(fā)性。 如果HikariCP可用,我們總是選擇它。
否則,如果Tomcat池化DataSource可用,我們將使用它。
如果HikariCP和Tomcat池化數(shù)據(jù)源都不可用,并且Commons DBCP2可用,我們就會(huì)使用它。
以上都是在沒(méi)有顯示配置數(shù)據(jù)源的情況進(jìn)行的步驟,若手動(dòng)顯示配置了指定數(shù)據(jù)源,則以上步驟失效。
一般情況下,springboot都是采用HikariCP來(lái)作為默認(rèn)的數(shù)據(jù)源。
如果我們想定義特定的數(shù)據(jù)源,一種簡(jiǎn)單的方法就是直接在application.properties指定:
//指定使用c3p0, 當(dāng)然你需要添加該數(shù)據(jù)源的依賴包,因?yàn)閟pringboot不默認(rèn)提供
spring.datasource.type=com.mchange.v2.c3p0.ComboPooledDataSource
另一種就是使用上面寫的配置類。
通過(guò)上述介紹,相信大家對(duì)Java數(shù)據(jù)源已經(jīng)有所了解,大家如果想了解更多相關(guān)知識(shí),不妨來(lái)關(guān)注一下本站的Java在線學(xué)習(xí)技術(shù)文檔,里面的課程內(nèi)容從入門到精通,細(xì)致全面,很適合沒(méi)有基礎(chǔ)的小伙伴學(xué)習(xí),希望對(duì)大家能夠有所幫助。
相關(guān)閱讀
Java實(shí)驗(yàn)班
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
Java就業(yè)班
有基礎(chǔ) 直達(dá)就業(yè)
Java夜校直播班
業(yè)余時(shí)間 高薪轉(zhuǎn)行
Java在職加薪班
工作1~3年,加薪神器
Java架構(gòu)師班
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)