微信优化

weixinyouhua

Spring配置JDBC怎么做?Spring配置jdbc连接池详细步骤

2026-09-14 10:17:24

Spring配置jdbc的最佳方式是Spring Boot的自动配置加application.yml,传统SSM项目再考虑XML方式;日常开发90%的配置工作都集中在连接参数、驱动和连接池三个点上。

两种主流方式,先对号入座

聊到spring配置jdbc,周围很多朋友第一反应是翻旧教程找XML,现在的项目分两派:继承了历史包袱的传统Spring MVC工程,以及新起的Spring Boot工程,两种工程的配置思路差别挺大,选错方向才会出现”配了半天连不上”的尴尬。

配置方式 典型场景 配置量 维护成本
XML配置 老项目、SSM框架整合 3-4个文件 偏高
Spring Boot配置 新服务、微服务架构 1个yml 推荐

行业共识认为,新项目一律走Spring Boot路线,XML配置主要服务于存量系统的维护改造,如果你手上是遗留的SSM工程,那才需要关心下面讲的XML写法。

spring mvc配置jdbc的XML操作步骤

对还在维护SSM工程的同学,直接看这段,老规矩,咱们按操作路径一步步来,跟着做就能跑通。

第一步:引入mysql驱动和spring-jdbc依赖

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.33</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.3.31</version>
</dependency>

没有spring-jdbc,后面用不了JdbcTemplate,到时候还得多写一堆原生的Connection管理代码,没必要。

第二步:建jdbc.properties数据库参数文件

在resources目录下建一个jdbc.properties,把连接信息收拢到一处,后续改库改密不用动XML:

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/demo_db?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
jdbc.username=root
jdbc.password=your_password

第三步:spring.xml里装配dataSource和JdbcTemplate

Spring配置JDBC怎么做?Spring配置jdbc连接池详细步骤

核心配置集中在spring.xml里,注意context:property-placeholder要放在前面加载参数:

<context:property-placeholder location="classpath:jdbc.properties"/>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <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="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="dataSource"/>
</bean>

做一个简单的测试验证,在Service里注入JdbcTemplate,执行一条select 1:

Integer result = jdbcTemplate.queryForObject("select 1", Integer.class);

能查到值,说明spring mvc配置jdbc这条路走通了,很多团队在这个阶段会卡在driverClassName上,老项目用com.mysql.jdbc.Driver,新驱动要换成com.mysql.cj.jdbc.Driver,注意区分。

spring boot配置jdbc连接mysql的yaml写法

到了Spring Boot 2.x/3.x时代,spring配置jdbc这事儿简化到一个文件,别被自动配置吓到,本质还是Spring帮你干了背后的事,不用自己注册bean了。

找mysql驱动依赖

操作路径:pom.xml里加一个依赖,驱动、连接池、DataSource自动化全搞定:

<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <scope>runtime</scope>
</dependency>

Spring Boot通过spring-boot-starter-data-jpa或spring-boot-starter-jdbc间接管理驱动版本,日常开发直接写starter即可,版本号交给父级BOM管,不用手填。

application.yml中配置数据源

最精简的spring boot配置jdbc连接mysql配置长这样:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/shop_db?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false
    username: root
    password: root123
    driver-class-name: com.mysql.cj.jdbc.Driver

Spring配置JDBC怎么做?Spring配置jdbc连接池详细步骤

这段配置面世以来基本是通用模板,mysql8以上版本必带serverTimezone参数,不指定时区必报时区异常。

验证连接

写个测试类,操作路径:项目test目录下新建spring boot测试,注入DataSource,打印连接状态:

@SpringBootTest
class DbConnectionTest {
    @Autowired
    private DataSource dataSource;
    @Test
    void checkConnection() throws Exception {
        try (Connection conn = dataSource.getConnection()) {
            System.out.println("connection ok: " + conn.getCatalog());
        }
    }
}

测试不报错,说明Spring Boot自动配置已经成功接管了jdbc连接管理,没做任何bean定义,靠自动配置完成的,这个对比很直观。

spring数据库连接池配置的实战细节

连接池是数据库连接配置绕不开的话题,很多新手在这块翻过车,Spring Boot 2.x以上默认使用HikariCP连接池,业界公认性能第一梯队。

HikariCP核心参数

没有特殊需求就用默认值,配置池大小有几个常用参数值得调:

spring:
  datasource:
    hikari:
      maximum-pool-size: 10
      minimum-idle: 5
      connection-timeout: 30000
      idle-timeout: 600000
  • maximum-pool-size:池中最大连接数,高并发接口才调大,别设太高撑爆数据库
  • minimum-idle:最小空闲连接,调太高浪费资源
  • connection-timeout:获取连接的超时时间,单位毫秒

常见翻车点排查

连接不上、超时

先用telnet 127.0.0.1 3306验证端口通不通,端口通了再看数据库侧的用户权限:

select user, host from mysql.user;

mysql8默认认证插件是caching_sha2_password,如果客户端驱动太老,也会报认证失败,要么升驱动,要么改用户插件为mysql_native_password,这条排查经验能解决相当一部分问题。

连接池耗尽、接口卡死

现象是服务偶发请求等待,日志出现connection is not available, request timed out

Spring配置JDBC怎么做?Spring配置jdbc连接池详细步骤

,多数情况下是连接没释入,检查代码里的数据库操作是否包裹在事务里,或者有没有手动获取Connection后忘记close,用JdbcTemplate治理,它会自动释放连接。

补充一个实战建议

配置明文密码不是好习惯,生产环境优先用环境变量注入或配置中心,操作路径:yml里写成${DB_PASSWORD}保留占位符,部署时从环境变量读取,代价最小,安全性提升明显。

从配置到运维的关键提醒

完成spring配置jdbc只是开始,数据库连接配置这层抽象,后续延伸的索引优化、慢查询治理才决定系统的性能上限,连接池从HikariCP切换到Druid,也只是改一个依赖和几行config的事,架构层面不会有任何影响。

多写一句给新手的话:遇到连接问题,按”驱动 > URL > 账号权限 > 网络连通性”的优先级去排查,顺序错了会走很多弯路,先把驱动版本对上,再谈其他,这个习惯能省一晚上排查时间。

相关问答

spring配置jdbc需要引入哪些依赖?

Spring传统工程需要加spring-jdbc和mysql-connector-java,再加事务管理用的spring-tx,Spring Boot工程引入spring-boot-starter-jdbc并声明mysql驱动即可,版本号交给父POM管理,如果做Web项目,spring-boot-starter-web已经传递引用了jdbc starter,无需重复声明。

spring配置jdbc的事务控制怎么处理?

Spring Boot下操作路径:在启动类加@EnableTransactionManagement,或者在Service方法上直接用@Transactional(Spring Boot会自动开启代理),XML方式需在配置文件里加<tx:annotation-driven transaction-manager="transactionManager"/>,并声明DataSourceTransactionManager bean,不配事务管理器直接注@Transactional不生效。

为什么spring boot配置jdbc后连接mysql还是报时区错误?

mysql8驱动对时区有严格校验。jdbc:mysql://localhost:3306/demo?serverTimezone=Asia/Shanghai,url后必须拼接时区参数,否则默认采用服务器UTC时区,本地连接会差8小时,更彻底的办法是在mysql服务端配置default-time-zone = '+08:00',这样即使连接串不写也能正常,多数云厂商RDS默认就是东八时区。

相关文章

2024年,SaaS软件行业碰到获客难、增长慢等问题吗?

我们努力让每一次邂逅总能超越期待