在 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;这样可以有效…