spring Boot數據源配置及資料庫連接池的概念

来源:https://www.cnblogs.com/zycb/archive/2019/05/06/10822579.html
-Advertisement-
Play Games

Spring中配置數據源的幾種方式 通過在JDBC驅動程式定義的數據源; 通過JNDI查找的數據源; 連接池的數據源; 使用JNDI數據源 Spring應用程式經常部署在Java EE應用伺服器中,例如Tomcat、JBoss。這些伺服器器允許你通過配置獲取數據源,這樣做的好處是數據源可以在應用之外 ...


Spring中配置數據源的幾種方式

  • 通過在JDBC驅動程式定義的數據源;
  • 通過JNDI查找的數據源;
  • 連接池的數據源;

使用JNDI數據源

Spring應用程式經常部署在Java EE應用伺服器中,例如Tomcat、JBoss。這些伺服器器允許你通過配置獲取數據源,這樣做的好處是數據源可以在應用之外進行管理。另外,在應用伺服器中數據源通常都是以連接池的方式組織,從而具備更好的性能,並且還支持系統管理員對其進行熱切換

對於Tomcat需要在tomcat/conf/context.xml中配置好連接信息,其中name指的是JNDI的名稱

 

<Resource auth="Container" 
driverClassName="oracle.jdbc.driver.OracleDriver" 
name="jdbc/dev" 
password="dev" 
type="javax.sql.DataSource" 
url="jdbc:oracle:thin:@127.0.0.1:1521/orcl" 
username="dev"/>

 

對於Sping應用來說需要手動配置

@Bean
public JndiObjectFactoryBean dataSource() {
    JndiObjectFactoryBean jndiObjectFactoryBean = new JndiObjectFactoryBean();
    jndiObjectFactoryBean.setJndiName("jdbc/dev");
    jndiObjectFactoryBean.setResourceRef(true);
    jndiObjectFactoryBean.setProxyInterface(javax.sql.DataSource.class);
    return jndiObjectFactoryBean;
}

Spring boot中幫我們自動配置好了,只需要在application.properties中聲明指定jndiName就可以了。

spring.datasource.jndi-name=java:comp/env/jdbc/dev
// 或者是
spring.datasource.jndi-name=jdbc/dev

因為Spring boot自帶web容器,因此JNDI方式只適用於將war發佈到獨立的web容器啟動的方式。

 

使用連接池的數據源

啥是連接池?

  資料庫連接池是web容器(比如Tomcat)提供的一個資料庫連接管理的容器,連接池負責分配、管理和釋放資料庫連接,它允許應用程式重覆使用一個現有的資料庫連接,而不是再重新建立一個。

 為什麼要用它?

   資料庫連接是一種關鍵的有限的昂貴的資源,這一點在多用戶的網頁應用程式中體現得尤為突出。  一個資料庫連接對象均對應一個物理資料庫連接,每次操作都打開一個物理連接,使用完都關閉連接,這樣造成系統的性能低下。 資料庫連接池的解決方案是在應用程式啟動時建立足夠的資料庫連接,並講這些連接組成一個連接池(簡單說:在一個“池”里放了好多半成品的資料庫聯接對象),由應用程式動態地對池中的連接進行申請、使用和釋放。對於多於連接池中連接數的併發請求,應該在請求隊列中排隊等待。並且應用程式可以根據池中連接的使用率,動態增加或減少池中的連接數。 連接池技術儘可能多地重用了消耗記憶體地資源,大大節省了記憶體,提高了伺服器地服務效率,能夠支持更多的客戶服務。通過使用連接池,將大大提高程式運行效率,同時,我們可以通過其自身的管理機制來監視資料庫連接的數量、使用情況等。 

在Spring Boot中怎麼用?

配置連接池參數

  • 最小連接數:是連接池一直保持的資料庫連接,所以如果應用程式對資料庫連接的使用量不大,將會有大量的資料庫連接資源被浪費.
  • 最大連接數:是連接池能申請的最大連接數,如果資料庫連接請求超過次數,後面的資料庫連接請求將被加入到等待隊列中,這會影響以後的資料庫操作
  • 最大空閑時間: 超出這個時間,該連接將被銷毀
  • 獲取連接超時時間: 超出時間程式將會返回連接超時異常
  • 超時重試連接次數: 超時後重新連接的次數

 

Spring Boot2.0預設使用HikariCP連接池得到數據源

spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.hikari.maximumPoolSize=5
spring.datasource.hikari.minimumIdle=5
spring.datasource.hikari.idleTimeout=600000
spring.datasource.hikari.connectionTimeout=30000
spring.datasource.hikari.maxLifetime=1800000

這樣就搞定了,Spring Boot幫我們把數據源創建、事務管理、JdbcTemplate創建都搞定了。

 

多數據源配置

在Sring boot中配置多數據源需要寫多套配置,例如創建兩個數據源

foo.datasource.url=jdbc:h2:mem:foo
foo.datasource.username=sa
foo.datasource.password=

bar.datasource.url=jdbc:h2:mem:bar
bar.datasource.username=sa
bar.datasource.password=

分別用Java Config 為不同的配置創建數據源Bean。

首先讓Spring boot取消自動配置

@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class,
        DataSourceTransactionManagerAutoConfiguration.class,
        JdbcTemplateAutoConfiguration.class})

然後手動配置DataSource和TransactionManager,@Primary註解指明當有兩個類實現同一介面的時候該採用哪個實現類進行@Autowried,另外可以在實現類上用@Qualifier("className")指定名稱,後面@Autowried的時候也用@Qualifier指定註入哪個類。

@Configuration
@Slf4j
public class DataSourceConfig {

    @Bean
    @ConfigurationProperties("foo.datasource")
    public DataSourceProperties fooDataSourceProperties() {
        return new DataSourceProperties();
    }

    @Bean
    @Primary
    public DataSource fooDataSource() {
        DataSourceProperties dataSourceProperties = fooDataSourceProperties();
        log.info("foo datasource: {}", dataSourceProperties.getUrl());
        return dataSourceProperties.initializeDataSourceBuilder().build();
    }

    @Bean
    JdbcTemplate fooJdbcTemplate(@Qualifier("fooDataSource")DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }

    @Bean
    @Resource
    public PlatformTransactionManager fooTxManager(DataSource fooDataSource) {
        return new DataSourceTransactionManager(fooDataSource);
    }



    @Bean
    @ConfigurationProperties("bar.datasource")
    public DataSourceProperties barDataSourceProperties() {
        return new DataSourceProperties();
    }

    @Bean
    public DataSource barDataSource() {
        DataSourceProperties dataSourceProperties = barDataSourceProperties();
        log.info("bar datasource: {}", dataSourceProperties.getUrl());
        return dataSourceProperties.initializeDataSourceBuilder().build();
    }

    @Primary
    @Bean
    JdbcTemplate barJdbcTemplate(@Qualifier("barDataSource")DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }

    @Bean
    @Resource
    public PlatformTransactionManager barTxManager(DataSource barDataSource) {
        return new DataSourceTransactionManager(barDataSource);
    }
}

 

到此我們可以使用DataSource了

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class,
        DataSourceTransactionManagerAutoConfiguration.class,
        JdbcTemplateAutoConfiguration.class})
@Slf4j
public class MultiDataSourceApplication implements CommandLineRunner {

    @Autowired
    private DataSource dataSource;

    @Autowired
    @Qualifier("barDataSource")
    private DataSource barDataSource;

    @Autowired
    @Qualifier("fooJdbcTemplate")
    private JdbcTemplate fooJdbcTemplate;

    @Autowired
    @Qualifier("barJdbcTemplate")
    private JdbcTemplate barJdbcTemplate;

    public static void main(String[] args) {
        SpringApplication.run(MultiDataSourceApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        showConnection();
    }

    private void showConnection() throws SQLException {
        log.info("fooDataSource數據源: " + dataSource.toString());
        log.info("fooJdbcTemplate: " + fooJdbcTemplate.toString());

        log.info("barDataSource數據源: " + barDataSource.toString());
        log.info("barJdbcTemplate: " + barJdbcTemplate.toString());


    }
}

 

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Python面向對象之類屬性類方法靜態方法,內容包括 類的結構,類屬性和實例屬性,類方法和靜態方法,方法綜合案例等。其中,類的結構 包括 實例,類是一個特殊的對象;類屬性和實例屬性 包括 類屬性的定義及使用,屬性的查找機制-向上查找;類方法和靜態方法 包括 類方法,靜態方法;方法綜合案例 僅包含 游... ...
  • 通過 python爬蟲入門:什麼是爬蟲,怎麼玩爬蟲? 我們知道了什麼是爬蟲 也知道了爬蟲的具體流程 那麼在我們要對某個網站進行爬取的時候 要對其數據進行分析 就要知道應該怎麼請求 就要知道獲取的數據是什麼樣的 所以我們要學會怎麼抓咪咪! 哦,不對。 我們要學會怎麼數據抓包 雖然小饅頭也是包的一種 o ...
  • 因為目前java非常火,應用非常的廣泛,是目前最火的行業之一,競爭很大,工資很高,未來發展也極好。首先告訴你的是,零基礎學習開始學習java肯定難,java的專業程度本身就不簡單,學習這事本來就是一件非常煎熬的事情,人都不願意學習,可是沒辦法,為了生存掌握一個技能,你必須學。 提醒大家幾點 一:盲目 ...
  • 目錄 1、python介紹 現在企業大量使用的有python2跟python3 安裝python解釋器,目前linux 、mac系統自帶有了,windowss系統中 打開官網 https://www.python.org/downloads/windows/ 分別有版本2和版本3 選擇自己電腦的操作 ...
  • import re def chen_chu(str): res = re.search("[^()]+",str) res_l = re.split("[*/]",res.group()) res_f_l = re.findall("[*/]",res.group()) n = None for ... ...
  • 01 內容大綱 1. is == id 用法 2. 代碼塊 3. 同一代碼塊下的緩存機制 4. 不同代碼塊下的緩存機制(小數據池) 5. 總結 6. 集合(瞭解) 7. 深淺copy 02 具體內容 1.id is == id是記憶體地址。 你只要創建一個數據(對象)那麼都會在記憶體中開闢一個空間,將這 ...
  • Go 作為一門靜態語言,相比 Python 等動態語言,在編寫過程中靈活性會受到一定的限制。但是通過介面加反射實現了類似於動態語言的能力:可以在程式運行時動態地捕獲甚至改變類型的信息和值。 ...
  • 轉自:https://blog.csdn.net/yl2isoft/article/details/17059093 結果分析 執行List的Clear方法和RemoveAll方法,List將清除指定元素,同時修改Count屬性值,而Capacity屬性值保持不變。 Clear方法和RemoveAl ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...