詳解 Spring 配置數據源的兩種方式

在 Spring 框架中配置數據源(DataSource)主要有兩種方式:

  1. 通過 Setter 注入配置數據源
  2. 通過 jdbc.properties 配置文件方式

本博文將使用 Druid 作為數據源,其在 Spring 項目中常見且高效。

Druid 被廣泛認為是性能最佳的連接池之一,尤其在高并發場景下表現優異。它支持快速的連接獲取和釋放,優化了資源管理

🌱 1. 通過 Setter 注入配置 Druid 數據源

? 1.1 Maven 依賴

<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.24</version> <!-- 請根據項目需要選擇版本 -->
</dependency>

? 1.2 XML 配置

修改 applicationContext.xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!-- Druid 數據源配置 --><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close"><property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mydb"/><property name="username" value="root"/><property name="password" value="root"/><!-- Druid 特有屬性 --><property name="initialSize" value="5"/><property name="minIdle" value="5"/><property name="maxActive" value="20"/><property name="maxWait" value="60000"/><property name="timeBetweenEvictionRunsMillis" value="60000"/><property name="minEvictableIdleTimeMillis" value="300000"/><property name="validationQuery" value="SELECT 1"/><property name="testWhileIdle" value="true"/><property name="testOnBorrow" value="false"/><property name="testOnReturn" value="false"/></bean><!-- JdbcTemplate 配置 --><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"/></bean></beans>

? 1.3 Java Config 配置 (推薦方式)

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;import javax.sql.DataSource;@Configuration
public class DataSourceConfig {@Bean(destroyMethod = "close")  // 指定關閉方法,釋放資源public DataSource dataSource() {DruidDataSource dataSource = new DruidDataSource();dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");dataSource.setUrl("jdbc:mysql://localhost:3306/mydb");dataSource.setUsername("root");dataSource.setPassword("root");// Druid 特有屬性dataSource.setInitialSize(5);dataSource.setMinIdle(5);dataSource.setMaxActive(20);dataSource.setMaxWait(60000);dataSource.setTimeBetweenEvictionRunsMillis(60000);dataSource.setMinEvictableIdleTimeMillis(300000);dataSource.setValidationQuery("SELECT 1");dataSource.setTestWhileIdle(true);dataSource.setTestOnBorrow(false);dataSource.setTestOnReturn(false);return dataSource;}@Beanpublic JdbcTemplate jdbcTemplate(DataSource dataSource) {return new JdbcTemplate(dataSource);}
}

🗂? 2. 通過 jdbc.properties 文件配置 Druid 數據源(推薦用于生產環境)

? 2.1 jdbc.properties 文件

# MySQL數據庫配置
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mydb
jdbc.username=root
jdbc.password=root

? 2.2 XML 配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><!--1.開啟命名空間--><!--2.使用 context 空間加載 properties 文件--><!-- <context:property-placeholder location="jdbc.properties" system-properties-mode="NEVER"/><context:property-placeholder location="jdbc.properties,jdbc2.properties" system-properties-mode="NEVER"/><context:property-placeholder location="*.properties" system-properties-mode="NEVER"/><context:property-placeholder location="classpath:*.properties" system-properties-mode="NEVER"/>  --><!--加載最全的方式,除了本項目路徑下的 properties,還可以加載 jar 包下的properties --><context:property-placeholder location="classpath*:*.properties" system-properties-mode="NEVER"/><!--3.使用屬性占位符 ${} 加載 properties 文件內容--><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="${jdbc.driver}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></bean><bean id="userDao" class="com.alivinfer.dao.impl.UserDaoImpl"><property name="name" value="${jdbc.driver}"/></bean>
</beans>

💡 注意
使用 property-placeholder 標簽需要引入以下命名空間:

xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context.xsd"

? 2.3 Java Config 配置 (推薦方式)

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import org.springframework.jdbc.core.JdbcTemplate;import javax.annotation.Resource;
import javax.sql.DataSource;@Configuration
@PropertySource("classpath:jdbc.properties") // 引入 properties 文件
public class DataSourceConfig {@Resourceprivate Environment env;@Bean(destroyMethod = "close")public DataSource dataSource() {DruidDataSource dataSource = new DruidDataSource();dataSource.setDriverClassName(env.getProperty("jdbc.driver"));dataSource.setUrl(env.getProperty("jdbc.url"));dataSource.setUsername(env.getProperty("jdbc.username"));dataSource.setPassword(env.getProperty("jdbc.password"));dataSource.setInitialSize(Integer.parseInt(env.getProperty("druid.initialSize")));dataSource.setMinIdle(Integer.parseInt(env.getProperty("druid.minIdle")));dataSource.setMaxActive(Integer.parseInt(env.getProperty("druid.maxActive")));dataSource.setMaxWait(Long.parseLong(env.getProperty("druid.maxWait")));dataSource.setTimeBetweenEvictionRunsMillis(Long.parseLong(env.getProperty("druid.timeBetweenEvictionRunsMillis")));dataSource.setMinEvictableIdleTimeMillis(Long.parseLong(env.getProperty("druid.minEvictableIdleTimeMillis")));dataSource.setValidationQuery(env.getProperty("druid.validationQuery"));dataSource.setTestWhileIdle(Boolean.parseBoolean(env.getProperty("druid.testWhileIdle")));dataSource.setTestOnBorrow(Boolean.parseBoolean(env.getProperty("druid.testOnBorrow")));dataSource.setTestOnReturn(Boolean.parseBoolean(env.getProperty("druid.testOnReturn")));return dataSource;}@Beanpublic JdbcTemplate jdbcTemplate(DataSource dataSource) {return new JdbcTemplate(dataSource);}
}

? 測試代碼

package com.alivinfer;import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;import javax.sql.DataSource;public class SpringTest {/*** 測試 xml 配置 druid 數據源*/@Testpublic void test() {// 獲取 IoC 容器ApplicationContext applicationContext = newClassPathXmlApplicationContext("applicationContext.xml");// 測試 druid 數據源DataSource dataSource = (DataSource) applicationContext.getBean("dataSource");System.out.println(dataSource);}}

🕶? Druid 數據源優勢

? 高效:相比 DriverManagerDataSource,Druid 提供更高的并發性能和更好的連接池管理
? 穩定:支持 SQL 監控、慢 SQL 記錄、防 SQL 注入、異常日志跟蹤等特性
? 易用:通過配置文件實現靈活的參數調整,方便不同環境下的使用


💡 常見問題

  1. Druid 日志過多

    • jdbc.properties 中添加以下配置可減少不必要的日志:
    druid.logAbandoned=false
    druid.removeAbandoned=false
    
  2. com.mysql.cj.jdbc.Driver 找不到

    • 確保 mysql-connector-java 版本兼容,并檢查 URL 是否包含 serverTimezone 參數:
    jdbc.url=jdbc:mysql://localhost:3306/mydb?serverTimezone=UTC
    
  3. 數據庫連接泄漏

    • 啟用 removeAbandoned 功能,自動關閉超時未關閉的連接:
    druid.removeAbandoned=true
    druid.removeAbandonedTimeout=1800
    

📌 總結

配置方式優點缺點推薦使用場景
Setter 注入 (XML/Java Config)簡單直觀,便于理解配置寫在代碼中,生產環境不推薦小型項目、快速開發、臨時測試
jdbc.properties 文件 (XML/Java Config)配置與代碼解耦、支持環境切換、易于維護需要維護額外的配置文件,但在中大型項目中是必要的企業級項目、生產環境、靈活配置

推薦使用

  • 企業項目生產環境 中,推薦使用 jdbc.properties 文件方式結合 Java Config,確保代碼簡潔、配置靈活,充分利用 Druid 的性能優勢和監控功能

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

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

相關文章

項目進度管理工具:甘特圖與關鍵路徑法(2025實戰指南)

在全球數字化轉型加速的背景下&#xff0c;項目延期率高達42%的現狀倒逼管理者掌握科學的進度管理工具。本文結合2025年最新實踐&#xff0c;深度解析甘特圖與關鍵路徑法的原理及應用&#xff0c;助你構建精準可控的項目進度管理體系。 一、雙劍合璧&#xff1a;工具組合的價值…

RAGS評測后的數據 如何利用influxdb和grafan 進行數據匯總查看

RAGS(通常指相關性、準確性、語法、流暢性)評測后的數據能借助 InfluxDB 存儲,再利用 Grafana 進行可視化展示,實現從四個維度查看數據,并詳細呈現每個問題對應的這四個指標情況。以下是詳細步驟: 1. 環境準備 InfluxDB 安裝與配置 依據自身操作系統,從 InfluxDB 官網下…

詳解Redis如何持久化

引言 本文介紹了 Redis 的兩種持久化方式&#xff1a;RDB 和 AOF。RDB 按時間間隔快照存儲&#xff0c;AOF 記錄寫操作。闡述了它們的配置、工作原理、恢復數據的方法、性能與實踐建議&#xff0c;如降低 fork 頻率、控制內存等&#xff0c;還提到二者可配合使用&#xff0c;最…

HarmonyOS Design 介紹

HarmonyOS Design 介紹 文章目錄 HarmonyOS Design 介紹一、HarmonyOS Design 是什么&#xff1f;1. 設計系統&#xff08;Design System&#xff09;2. UI 框架的支持3. 設計工具和資源4. 開發指南5. 與其他設計系統的對比總結 二、HarmonyOS Design 特點 | 應用場景1. Harmon…

PC端-發票真偽查驗系統-Node.js全國發票查詢接口

在現代企業的財務管理中&#xff0c;發票真偽的驗證至關重要。隨著電子發票的普及&#xff0c;假發票問題日益嚴峻&#xff0c;如何高效、準確的對發票進行真偽查驗&#xff0c;已經成為各類企業在日常運營中必須解決的關鍵問題。翔云發票查驗接口做企業財務管理、稅務合規的好…

Java 大視界 -- 基于 Java 的大數據機器學習模型壓縮與部署優化(99)

&#x1f496;親愛的朋友們&#xff0c;熱烈歡迎來到 青云交的博客&#xff01;能與諸位在此相逢&#xff0c;我倍感榮幸。在這飛速更迭的時代&#xff0c;我們都渴望一方心靈凈土&#xff0c;而 我的博客 正是這樣溫暖的所在。這里為你呈上趣味與實用兼具的知識&#xff0c;也…

算法-圖-數據結構(鄰接矩陣)-BFS廣度優先遍歷

鄰接矩陣廣度優先遍歷&#xff08;BFS&#xff09;是一種用于遍歷或搜索圖的算法&#xff0c;以下是具體介紹&#xff1a; 1. 基本概念 圖是一種非線性的數據結構&#xff0c;由頂點和邊組成&#xff0c;可分為無向圖、有向圖、加權圖、無權圖等。鄰接矩陣是表示圖的一種數…

【HDLbits--Comb組合邏輯】

HDLbits--Comb組合邏輯 1.5 組合邏輯1.5 Demo 在 Verilog 中&#xff0c;組合邏輯&#xff08;Combinational Logic&#xff09;是指輸出僅依賴于當前輸入的邏輯電路&#xff0c;沒有記憶功能&#xff08;即沒有狀態存儲&#xff09;。組合邏輯的特點是&#xff1a; 無時鐘信號…

ARM Cortex-M3 技術解析:核寄存器R1-R15介紹及使用

ARM Cortex-M3 技術解析&#xff1a;核寄存器R1-R15介紹及使用 作為嵌入式開發領域的經典處理器內核&#xff0c;ARM Cortex-M3&#xff08;CM3&#xff09;憑借其高效能、低功耗和豐富特性&#xff0c;在工業控制、物聯網、消費電子等領域廣泛應用。而內核寄存器是我們調試代…

python unzip file

要在 Python 中解壓文件并顯示進度&#xff0c;我們需要在解壓過程中跟蹤文件的提取進度。由于 zipfile 模塊本身不直接支持進度顯示&#xff0c;我們可以通過手動計算并使用 tqdm 庫來顯示進度條。 安裝 tqdm 首先&#xff0c;確保你已經安裝了 tqdm 庫&#xff0c;用于顯示…

DeepSeek+Kimi生成高質量PPT

DeepSeek與Kimi生成PPT全流程解析 一、工具分工原理 DeepSeek核心作用&#xff1a;生成結構化PPT大綱&#xff08;擅長邏輯構建與內容優化&#xff09;Kimi核心作用&#xff1a;將文本轉換為視覺化PPT&#xff08;提供模板庫與排版引擎&#xff09; 二、操作步驟詳解 1. 通…

一文掌握python中正則表達式的各種使用

文章目錄 1. 正則表達式基礎1.1 常用元字符1.2 基本用法 2. 正則表達式高級功能2.1 分組捕獲2.2 命名分組2.3 非貪婪匹配2.4 零寬斷言2.5 編譯正則表達式2.6 轉義字符 3. 常見應用場景3.1 驗證郵箱格式3.2 提取 URL3.3 提取日期3.4 提取HTML中的鏈接3.5 提取HTML中的圖片鏈接3.…

TCP,http,WebSocket

TCP&#xff08;Transmission Control Protocol&#xff0c;傳輸控制協議&#xff09;和HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本傳輸協議&#xff09;都是網絡通信中的重要協議&#xff0c;但它們在網絡協議棧的不同層次上工作&#xff0c;各自負責不同…

Redis|持久化

文章目錄 總體介紹RDB&#xff08;Redis DataBase&#xff09;官網介紹案例演示優勢劣勢如何檢查修復 dump.rdb 文件哪些情況下會觸發 RDB 快照如何禁用快照RDB 優化配置項詳解小總結 AOF&#xff08;Append Only File&#xff09;官網介紹是什么能干嘛AOF 持久化工作流程AOF 緩…

Docker小游戲 | 使用Docker部署star-battle太空飛船射擊小游戲

Docker小游戲 | 使用Docker部署star-battle太空飛船射擊小游戲 前言項目介紹項目簡介項目預覽二、系統要求環境要求環境檢查Docker版本檢查檢查操作系統版本三、部署star-battle網頁小游戲下載鏡像創建容器檢查容器狀態檢查服務端口安全設置四、訪問star-battle網頁小游戲五、總…

巨控科技的GRM550元出魔抗實現PLC遠程下載與維護方案:工業自動化的高效解決方案

巨控科技PLC遠程下載與維護方案&#xff1a;工業自動化的高效解決方案 在工業自動化領域&#xff0c;設備的高效維護與快速調試是保障生產連續性的關鍵。巨控科技推出的PLC遠程下載與維護方案&#xff0c;憑借其先進的技術和廣泛兼容性&#xff0c;成為企業實現設備遠程管理的…

ChatGLM2-6B如何從輸入到輸出-代碼解析(二)

出發點 上一篇解析了Chatglm2-6b的模型架構&#xff0c;并和Chatglm-6b進行對比&#xff0c;但是留下了幾個問題&#xff08;哭&#xff09;這一篇的目的是講明白attention和rotaryEmbedding&#xff0c;解決問題&#xff0c;并實現整體目標&#xff0c;完全替代modeling_chat…

Sublime Text4安裝、漢化

-------------2025-02-22可用---------------------- 官方網址下載&#xff1a;https://www.sublimetext.com 打開https://hexed.it 點擊打開文件找到軟件安裝目錄下的 ctrlf 查找 8079 0500 0f94 c2右邊啟用替換替換為:c641 0501 b200 90點擊替換按鈕 替換完成后 另存為本地…

汽車開放系統架構(AUTOSAR)中運行時環境(RTE)生成過程剖析

一、引言 在當今高度智能化的汽車電子領域&#xff0c;軟件系統的復雜性呈指數級增長。為了應對這一挑戰&#xff0c;汽車開放系統架構&#xff08;AUTOSAR&#xff09;應運而生&#xff0c;它為汽車電子軟件開發提供了標準化的分層架構和開發方法。其中&#xff0c;運行時環境…

基于MATLAB的OFDM通信系統仿真設計

下面將為你詳細介紹基于MATLAB的OFDM通信系統仿真設計的步驟和示例代碼。 1. OFDM系統原理概述 正交頻分復用&#xff08;OFDM&#xff09;是一種多載波調制技術&#xff0c;它將高速數據流通過串并轉換&#xff0c;分配到多個正交的子載波上進行傳輸&#xff0c;這樣可以有效…