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