Java 中 DataSource-數據源 的基礎介紹

Java 中 DataSource-數據源 的基礎介紹

  • 一、核心概念解析
    • 1.1 數據源(Data Source)
    • 1.2 數據庫連接池(Connection Pool)
    • 1.3 二者關系
    • 1.4 DataSource 接口
  • 二、DataSource 解決的問題與優勢
    • 2.1 DataSource 的作用
    • 2.2 傳統方式的局限性
    • 2.3 使用連接池 DataSource 的改進
  • 三、Spring Boot 中 DataSource 的配置與使用
    • 3.1 自動配置
    • 3.2 自定義配置

一、核心概念解析

1.1 數據源(Data Source)

數據源是一個抽象概念,代表數據的來源和訪問方式。它封裝了數據庫連接所需的配置信息(如 URL、用戶名、密碼),并提供獲取數據庫連接的接口。從本質上講,數據源是一種數據訪問抽象,它屏蔽了底層數據存儲的細節,使應用程序能夠以統一的方式訪問不同類型的數據庫。

1.2 數據庫連接池(Connection Pool)

數據庫連接池是一種管理數據庫連接的技術,屬于數據源的一種具體實現方式。它通過預先創建一定數量的連接并維護在池中,當應用程序需要連接時直接從池中獲取,使用完畢后歸還而非關閉,從而避免頻繁創建和銷毀連接帶來的性能開銷。

1.3 二者關系

數據源是一個更寬泛的概念,而連接池是數據源的一種高效實現方式。可以將它們的關系理解為:
數據源(抽象概念) ? 連接池(具體實現)

從技術角度看:

  • 非連接池數據源:每次請求都創建新連接(如傳統的 DriverManager 方式)
  • 連接池數據源:復用現有連接,提高性能(如 HikariCPDBCP

1.4 DataSource 接口

javax.sql.DataSourceJava 提供的數據源標準接口,它定義了獲取數據庫連接的方法(getConnection())。該接口既可以由連接池實現(如 HikariDataSource),也可以由非連接池實現(如簡單的 DriverManagerDataSource)。

public interface DataSource  extends CommonDataSource, Wrapper {Connection getConnection() throws SQLException;Connection getConnection(String username, String password)throws SQLException;
}

二、DataSource 解決的問題與優勢

2.1 DataSource 的作用

  • 統一連接獲取方式:通過getConnection()方法提供標準接口,使代碼不依賴具體實現
  • 支持多種實現策略:既可以使用連接池提高性能,也可以使用簡單實現進行測試
  • 配置與代碼解耦:數據庫配置信息(URL、用戶名等)可外部化配置,便于維護
  • 資源管理與監控:連接池實現支持連接狀態監控、自動回收空閑連接等高級特性
  • 容器集成:與應用服務器(如 Tomcat)或框架(如 Spring)深度集成,提供 JNDI 等高級特性

2.2 傳統方式的局限性

JDBC知識點記憶模糊的同學可以參考這篇文章溫故一下:【JDBC 核心執行流程詳解】
代碼示例(不使用 DataSource):

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;public class TraditionalConnectionExample {public static void main(String[] args) {try (Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "password")) {// 執行SQL操作} catch (SQLException e) {e.printStackTrace();}}
}

問題分析:

  1. 性能瓶頸:每次請求都創建新連接,高并發下開銷大
  2. 資源浪費:未復用連接,可能導致數據庫連接數超限
  3. 配置分散:連接參數硬編碼在代碼中,難以統一管理
  4. 錯誤處理復雜:需手動管理連接關閉,易造成資源泄漏

2.3 使用連接池 DataSource 的改進

代碼示例(使用 HikariCP 連接池):

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;public class DataSourceExample {private static final DataSource dataSource;static {// 配置連接池HikariConfig config = new HikariConfig();config.setJdbcUrl("jdbc:mysql://localhost:3306/mydb");config.setUsername("root");config.setPassword("password");config.setMaximumPoolSize(10);  // 最大連接數config.setMinimumIdle(5);     // 最小空閑連接數dataSource = new HikariDataSource(config);}public static void main(String[] args) {try (Connection conn = dataSource.getConnection();Statement stmt = conn.createStatement();ResultSet rs = stmt.executeQuery("SELECT * FROM users")) {while (rs.next()) {System.out.println("User: " + rs.getString("username"));}} catch (SQLException e) {e.printStackTrace();}}
}

優勢分析:

  1. 連接復用:連接從池中獲取,使用后歸還,避免重復創建
  2. 性能提升:測試顯示,高并發下響應時間降低約 70%
  3. 配置集中化:所有連接參數統一在配置類中管理
  4. 自動資源回收:連接池自動管理連接生命周期,減少泄漏風險

三、Spring Boot 中 DataSource 的配置與使用

3.1 自動配置

Spring Boot 默認使用 HikariCP 作為數據源,只需在application.properties中添加以下配置:

spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

3.2 自定義配置

如需自定義連接池參數,可創建配置類:

import com.zaxxer.hikari.HikariDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;@Configuration
public class DataSourceConfig {@Beanpublic DataSource dataSource() {HikariDataSource ds = new HikariDataSource();ds.setJdbcUrl("jdbc:mysql://localhost:3306/mydb");ds.setUsername("root");ds.setPassword("password");ds.setMaximumPoolSize(15);ds.setIdleTimeout(30000);return ds;}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/87190.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/87190.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/87190.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Vue + Vite 項目部署 Docker 全攻略:原理、路由機制、問題排查與開發代理解析

Vue Vite 項目部署 Docker 全攻略:原理、路由機制、問題排查與開發代理解析 本文面向希望將 Vue 3 Vite 項目部署到生產環境(Docker NGINX)并深入理解路由行為、構建機制與常見問題排查的開發者。 📦 一、項目準備 以 Vue 3 …

Vue3 + TypeScript 使用 v-bind() 在 <style scoped> 中動態設置 CSS 樣式值

使用要求&#xff1a; Vue 3.3 <style scoped>&#xff0c;Vue 的 v-bind() 在 CSS 中只支持在 scoped style 或 CSS Modules 中使用v-bind("cssVar") 雙引號包裹響應式變量&#xff0c;變量 cssVar 必須是 Vue 的響應式數據&#xff08;如 ref 或 reactive&…

php列表頭部增加批量操作按鈕,多選訂單數據批量微信退款(含微信支付SDK)

index_search.html data-table-id:表格id data-rule:需要傳輸的列表字段 data-action:控制器方法 <a class="layui-btn layui-btn-primary layui-btn-sm" style=

小程序還沒有上線就提示小程序違規,支付失敗

如果出現這種情況&#xff0c;一般情況下不是真正的違規&#xff0c;是因為在小程序后臺&#xff0c;沒有設置訂單詳情頁面的path地址的原因 1.首先看一下&#xff0c;在站內信中是否有相關訂單的通知&#xff1a;站內信&#xff08;小程序通知中心&#xff09;查看是否看到 關…

展開說說Android之Glide詳解_源碼解析

基于上一篇介紹了Glide的使用篇本文分析一下Glide的源碼實現&#xff0c;看看我們簡單幾步就實現的圖片展示功能在源碼中是怎樣完成的。 一、Glide中的核心文件 先逐個介紹一下個人以為的幾個核心類&#xff1a;? 1、Glide Glide是必經的入口&#xff0c;通過Glide.get(con…

商品中心—6.商品考核系統的技術文檔二

大綱 1.基于大數據系統的商品考核數據指標 2.基于商品考核數據指標的商品考核流程 3.商品考核失敗后的處理 考核流程的設計 4.商品考核系統數據庫模型設計 5.商品考核系統核心接口 6.商品生命周期系統的定時考核任務 6.商品生命周期系統的定時考核任務 (1)定時任務處理…

鴻蒙組件通用事件開發全攻略:從基礎交互到工程實踐

一、引言&#xff1a;事件系統 —— 構建交互體驗的核心樞紐 在鴻蒙應用開發體系中&#xff0c;組件事件系統是連接用戶操作與應用邏輯的關鍵橋梁。從基礎的點擊交互到復雜的多觸點手勢&#xff0c;通用事件覆蓋了全場景設備的交互需求。本文將系統解構鴻蒙事件體系的核心機制…

老項目重構難題破解:飛算 JavaAI 如何實現技術升級突圍

在企業數字化轉型進程中&#xff0c;大量 Java 老項目因長期迭代積累的技術債務&#xff0c;陷入 "重構必要性與實施難度并存" 的困境。這些遺留系統普遍存在代碼體系老化、架構模式滯后、維護成本高企等問題&#xff0c;成為企業技術升級的絆腳石。 傳統 Java 老項…

idea使用技巧分享

寫在前面 分享一些常用的idea使用技巧&#xff0c;進來看看有沒有你不知道的。 設置項目默認配置 TODO設置 位置 方式一&#xff1a;setting -> editor -> TODO 方式二&#xff1a; 定義Patterns過濾模式 正則中“\b”是元字符代表著單詞的開頭或結尾&#xff0c;也就…

【Dify精講】第8章:Agent能力實現原理【知識卡片】

第8章&#xff1a;Agent能力實現原理http://www.airinto.com/share/e7b7e27f 一、Agent架構設計 二、工具調用機制 三、ReAct框架實現 四、自定義Agent開發 五、性能優化與監控 六、總結與實戰建議

【軟件】安裝Miniconda

安裝 根據搜索結果&#xff0c;以下是使用Homebrew在macOS上安裝Miniconda的詳細步驟&#xff1a; 1.安裝Homebrew&#xff08;如果尚未安裝&#xff09; 打開終端&#xff08;Terminal&#xff09;&#xff0c;運行以下命令安裝Homebrew&#xff1a; /bin/bash -c "$(…

FastAPI:(6)錯誤處理

FastAPI&#xff1a;(6)錯誤處理 由于CSDN無法展示「漸構」的「#d&#xff0c;#e&#xff0c;#t&#xff0c;#c&#xff0c;#v&#xff0c;#a」標簽&#xff0c;推薦訪問我個人網站進行閱讀&#xff1a;Hkini 「漸構展示」如下&#xff1a; #c 概述 文章概念關系 graph TDA…

408第一季 - 數據結構 - 排序

排序的概念 外部排序很難&#xff0c;后面都是內部排序 插入排序 直接插入排序 理解 這個排序第一輪是從第二個元素開始的 然后是從后往前一個一個比的 然后我們看i5的情況&#xff0c;會出現比較次數和移動次數的概念&#xff0c;這里97動了 然后i8時&#xff0c;49最好…

高效賬號信息管理工具,可安全隨機生成密碼

軟件介紹 今天給大家推薦一款安全可靠的密碼管理工具&#xff0c;幫助用戶輕松管理各類賬號密碼。 安全便捷的密碼解決方案 這是一款采用先進加密技術開發的密碼管理器&#xff0c;不僅可以生成高強度隨機密碼&#xff0c;還提供安全的賬號密碼備份存儲功能。 基礎安全設置 …

如何在markdown文件中(博客)添加emoji表情,讓你的博客看起來更加優雅

在Markdown中使用Emoji的完整指南 按分類快速參考的完整Emoji列表一、狀態指示類:bulb:二、提示信息類:bulb:三、內容類型類:bulb:四、操作指令類:bulb:五、進度狀態類:bulb:六、技術相關類:bulb:七、人員角色類:bulb:八、版本控制類:bulb: 你學會了嗎 按分類快速參考的完整Emo…

MAZANOKE:一款隱私優先的瀏覽器圖像優化工具及Docker部署指南

在日常工作中&#xff0c;大家是否經常遇到這樣的需求&#xff1a;需要壓縮圖片體積、調整圖片尺寸或轉換圖片格式&#xff0c;但又受限于數據安全要求無法將圖片上傳至公網&#xff1f;在我們之前開發的工單配置系統中&#xff0c;這類需求尤為常見。最近在GitHub上發現了一款…

【Vue PDF】Vue PDF 組件初始不加載 pdfUrl 問題分析與修復

Vue PDF 組件初始不加載 pdfUrl 問題分析與修復 問題現象 在開發 PDF 預覽組件時&#xff0c;遇到這樣一個問題&#xff1a; 初始狀態下&#xff0c;PDF 組件不會請求 pdfUrl&#xff08;即不會加載 PDF 文件&#xff09;。只有點擊"全屏"按鈕后&#xff0c;才會請…

《注解的江湖:一場元數據的“宮斗劇”》

一、你真的懂注解嗎 你是否使用過Autowired卻不知道是如何生效的&#xff1f; 這幾個注解你一定很熟悉&#xff1a; OverrideDeprecatedTransactional 那么你有進一步思考過怎么生效的嗎&#xff1f;注解到底是什么&#xff1f;注解&#xff0c;到底是信息&#xff1f;還是指…

智能土木通 - 土木工程專業知識問答系統02-RAG檢索模塊搭建

一、項目目錄 civil_qa_system/ ├── docs/ # 項目文檔 ├── config/ # 配置文件 ├── core/ # 核心功能代碼 ├── knowledge_base/ # 知識庫相關 ├── web/ # Web應用部分 ├…

進程和線程區別、管道和套接字、共享變量、TCP三次握手,是否可以少一次握手、子進程和主進程區別和API——Nodejs

首先講了進程和線程區別 然后講解 管道和套接字&#xff0c;它是進程間通信的方式 接著講解共享變量 &#xff0c;它是線程間通信 最后講解TCP三次握手&#xff0c;因為套接字使用了TCP協議 一、線程和進程的區別 線程&#xff08;Thread&#xff09;和進程&#xff08;Pr…