成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

深挖 Spring Boot:八種數據庫連接控制機制,哪個才是你的最優解?

數據庫 其他數據庫
Spring 推薦使用 javax.sql.DataSource 作為統一的連接工廠接口,它屏蔽了底層連接池實現的細節,使得我們能更專注于業務代碼開發。

在企業級開發中,數據庫連接是系統資源中最昂貴、最敏感的組件之一。Spring Boot 借助其靈活而強大的數據庫訪問基礎設施,為連接的獲取、綁定、釋放與事務整合提供了完備方案。本文將以深入淺出的方式,解構 Spring 提供的 8 種數據庫連接控制手段,幫助你全面理解連接背后的運作機制與使用場景。

1、基于 DataSource 的連接機制

核心思想:

Spring 推薦使用 javax.sql.DataSource 作為統一的連接工廠接口,它屏蔽了底層連接池實現的細節,使得我們能更專注于業務代碼開發。

實現邏輯詳解:

Spring Boot 自動配置會讀取 application.yml 中的相關屬性并創建數據源實例。通常采用連接池技術(如 HikariCP),通過 DataSourceBuilder 構建連接池對象。例如:

@Bean
@ConfigurationProperties(prefix = "spring.datasource.hikari")
public DataSource dataSource(DataSourceProperties properties) {
    return DataSourceBuilder.create()
        .type(HikariDataSource.class)
        .driverClassName(properties.getDriverClassName())
        .url(properties.getUrl())
        .username(properties.getUsername())
        .password(properties.getPassword())
        .build();
}

此方式重點在于配置靈活性強,并結合連接池實現了線程復用、連接限流等能力,是企業級開發的首選方式。

2、使用 DataSourceUtils 簡化連接釋放流程

核心思想:

org.springframework.jdbc.datasource.DataSourceUtils 提供了對數據庫連接的透明管理,主要解決的問題是:在事務上下文中確保使用的是 Spring 管理的連接。

實現邏輯詳解:

  • 在執行數據庫操作時,通過 DataSourceUtils.getConnection() 自動檢查當前線程是否已綁定連接。
  • 若綁定,則復用當前連接;否則新建并綁定;
  • 釋放連接時,releaseConnection() 會判斷事務狀態,在事務尚未提交或回滾前不會關閉連接。
Connection conn = DataSourceUtils.getConnection(dataSource);
// 這里獲取的 Connection 是事務感知的
DataSourceUtils.releaseConnection(conn, dataSource);

該機制保障了同一事務上下文中的所有 JDBC 操作使用的是同一個物理連接,保障了原子性。

3、實現 SmartDataSource:決定是否關閉連接

核心思想:

SmartDataSource 是 Spring 擴展的接口,旨在控制連接的釋放行為。相比標準 DataSource接口,它多了一個 shouldClose() 方法,用來告知容器連接是否應該被物理關閉。

實現邏輯詳解:

使用 DataSourceUtils.releaseConnection() 釋放連接時,內部會判斷數據源是否為 SmartDataSource,如果返回 false,則連接不會關閉,而是保留用于后續復用。

public interface SmartDataSource extends DataSource {
    boolean shouldClose(Connection con);
}

適合那些需保持長連接但又不希望頻繁開關連接的場景(如:批處理、連接代理等)。

4、自定義數據源?繼承 AbstractDataSource 即可

核心思想:

Spring 的 AbstractDataSource 是一個輔助開發的抽象基類,幫助你快速實現自定義 DataSource。它已實現了接口的基礎邏輯,開發者只需聚焦于 getConnection() 方法即可。

實現邏輯詳解:

public class CustomDataSource extends AbstractDataSource {
    @Override
    public Connection getConnection() throws SQLException {
        return actualDataSource.getConnection();
    }


    @Override
    public Connection getConnection(String username, String password) throws SQLException {
        return actualDataSource.getConnection(username, password);
    }
}

適用于你需要對連接獲取過程進行代理、增強(如加密解密、限流、審計)等操作的場景。

5、SingleConnectionDataSource:重用單個連接

核心思想:

該類實現 SmartDataSource,只維護單一物理連接,每次調用 getConnection() 實際返回的是該連接的代理對象。這種方式主要用于測試或簡化環境中的連接重用。

實現邏輯詳解:

  • 每次調用返回的 Connection 是代理對象;
  • 如果設置了 suppressClose=true,即使執行 close() 也不會關閉連接;
  • 不支持并發訪問,因此不可用于生產環境。

適合那些對連接一致性要求較高、頻繁測試同一連接上下文行為的場合,如報表、數據庫回歸測試等。

6、DriverManagerDataSource:非連接池的 DataSource

核心思想:

該類是直接基于 DriverManager 實現的連接工廠。每次調用 getConnection() 都會返回一個全新的連接,無連接池,適合快速測試或臨時腳本用途。

實現邏輯詳解:

@Bean
public DriverManagerDataSource dataSource() {
    DriverManagerDataSource ds = new DriverManagerDataSource();
    ds.setDriverClassName("org.hsqldb.jdbcDriver");
    ds.setUrl("jdbc:hsqldb:hsql://localhost/");
    ds.setUsername("sa");
    ds.setPassword("");
    return ds;
}

因頻繁創建物理連接導致資源開銷大,不推薦在高并發或生產環境中使用。

7、TransactionAwareDataSourceProxy:讓遺留代碼支持事務

核心思想:

該代理類包裝一個常規 DataSource 實例,為其添加 Spring 事務感知能力,使得即使是非 Spring 管理的 DAO 代碼也能“被動”參與到事務控制中。

實現邏輯詳解:

  • 獲取連接時判斷當前線程是否存在事務;
  • 如果有,則復用事務綁定連接;
  • 如果沒有,則正常獲取新連接;

常用于整合遺留系統或第三方庫代碼的場景。它是非侵入式的事務集成方式。

@Bean
public DataSource transactionAwareDataSource() {
    return new TransactionAwareDataSourceProxy(realDataSource());
}

8、DataSourceTransactionManager:顯式管理事務

核心思想:

DataSourceTransactionManager 是 Spring 原生的事務管理器,用于管理基于 JDBC 的事務。它綁定數據庫連接到當前線程,控制事務的開始、提交與回滾。

實現邏輯詳解:

  • 事務開啟時,通過 DataSourceUtils 獲取連接并與線程綁定;
  • 調用 commit() 或 rollback() 控制物理連接行為;
  • 最終通過 releaseConnection() 釋放連接。
@Bean
public PlatformTransactionManager txManager(DataSource dataSource) {
    DataSourceTransactionManager tx = new DataSourceTransactionManager();
    tx.setDataSource(dataSource);
    tx.setDefaultTimeout(10); // 設置默認事務超時時間
    return tx;
}

這是 Spring 框架 JDBC 模塊的事務控制核心,適用于所有單庫 JDBC 場景,是聲明式事務 @Transactional 背后的底層支持。

總結

控制方式

是否支持事務綁定

是否連接池

是否線程安全

用途

DataSource

?(需結合工具類)

?(取決于實現)

?

主流配置入口

DataSourceUtils

?

?

?

內部連接協調

SmartDataSource

?

?/?

?

靈活釋放控制

AbstractDataSource

?

依賴實現

?

自定義擴展

SingleConnectionDataSource

?

?

?

測試環境專用

DriverManagerDataSource

?

?

?

快速演示、測試

TransactionAwareDataSourceProxy

?

?

?

適配第三方遺留代碼

DataSourceTransactionManager

?

?

?

事務控制主力


責任編輯:武曉燕 來源: 路條編程
相關推薦

2025-06-04 02:15:00

數據庫連接方式JDBC

2023-09-06 13:16:00

數據庫數據

2024-03-26 00:05:13

數據庫數據結構

2023-09-12 13:42:00

數據庫數據庫緩存

2011-05-13 13:38:49

數據庫對象

2022-11-03 11:32:24

數據Python方法

2011-05-26 09:27:59

JDBC連接數據庫

2020-07-10 06:11:19

數據庫擴展負載

2011-05-18 10:26:34

java

2018-09-27 16:15:10

區塊鏈數據庫

2010-05-26 17:05:48

MySQL數據類型

2022-02-17 11:03:33

數據庫基礎語法用法

2009-06-30 14:37:08

數據庫JSP

2011-03-08 08:59:01

SQL Server數數據移動

2010-09-26 16:31:13

隨機查詢語句

2021-11-12 05:45:12

云數據庫云計算

2021-03-03 00:01:30

Redis數據結雙向鏈表

2021-08-04 16:58:25

數據高考錄取人數

2018-09-27 15:58:06

MySQL數據庫性能優化

2021-10-11 08:00:00

開發Java語言
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 狠狠亚洲 | 两性午夜视频 | 国产成人综合亚洲欧美94在线 | 久久成人在线视频 | 动漫www.被爆羞羞av44 | 日本久久久久久 | 日韩精品一区二区三区视频播放 | 中文字幕亚洲欧美日韩在线不卡 | 九九九久久国产免费 | 欧美成人免费在线视频 | 久久精品久久综合 | 精品二区 | 国产精品69久久久久水密桃 | 91精品国产乱码久久久久久久久 | 在线国产一区二区 | 在线中文一区 | 午夜视频免费在线观看 | 精品av久久久久电影 | 成人三级网址 | 一区二区在线不卡 | 久操av在线| 日韩网站在线观看 | 欧美日韩国产一区 | 91视视频在线观看入口直接观看 | 国产精品1区2区 | 天堂中文在线播放 | 亚洲一卡二卡 | 无毛av| 久久久久久久一区二区三区 | 91在线一区二区 | 午夜精品一区二区三区免费视频 | 久久网一区二区三区 | 黄色大片在线视频 | 另类亚洲视频 | 国产精品久久久久久一区二区三区 | av一区二区三区四区 | 中文字幕av亚洲精品一部二部 | 久久精品91 | 成人三区四区 | 一区二区国产精品 | 国产99久久精品一区二区永久免费 |