JDBC 的DataSource配置问题1

本文分享了作者在使用JDBC进行项目开发过程中遇到的DataSource配置问题及解决方法,包括resource标签大小写敏感问题和Cannot load JDBC driver错误的解决办法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JDBC 的DataSource配置问题

今天第一次尝试着用JDBC做项目, 然而JDBC一直提示数据库的URL是null. 搞了很久也没搞清楚为什么, 网上查资料要么说是web.xml没写rel, 要么说是context.xml的配置问题, 这些问题我都没有出现, 折腾了一晚上终于发现了最终问题是resource标签的开头不能大写… 竟然就是这么一个小问题…请允许我做一个悲伤的表情.

还有一个问题就是Cannot load JDBC driver, 这个问题只要在项目的lib和tomcat的lib下都放mysql的jar包就好了.

mysql-connector-java的版本太高(6.0.6)会出现fail to connect的问题. 改成5.1.45就能连上

### Dynamic-Datasource Spring Boot 配置教程及常见问题解决方案 #### 1. Dynamic-Datasource 简介 Dynamic-Datasource 是一个基于 Spring Boot 的开源多数据源解决方案,支持多种数据库(如 MySQL、Oracle、SQL Server 等),并提供动态切换数据源的功能[^3]。它可以通过配置文件或注解的方式自动配置数据源,并支持自定义数据源路由规则。 #### 2. 配置步骤 ##### 2.1 引入依赖 在 `pom.xml` 文件中添加以下依赖: ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>dynamic-datasource-spring-boot-starter</artifactId> <version>3.5.0</version> </dependency> ``` ##### 2.2 配置多数据源 在 `application.yml` 文件中配置多个数据源: ```yaml spring: datasource: dynamic: primary: master # 设置主数据源 strict: false # 是否严格匹配数据源 datasource: master: url: jdbc:mysql://localhost:3306/master_db?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&useSSL=false username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver slave1: url: jdbc:mysql://localhost:3306/slave1_db?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&useSSL=false username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver slave2: url: jdbc:mysql://localhost:3306/slave2_db?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&useSSL=false username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver ``` ##### 2.3 配置事务管理器 将动态数据源加载类 `DynamicDataSource` 添加到事务管理器中: ```java @Bean public DataSourceTransactionManager transactionManager(DynamicDataSource dynamicDataSource) { return new DataSourceTransactionManager(dynamicDataSource); } ``` 上述代码确保了事务管理器能够正确识别动态数据源[^4]。 ##### 2.4 自定义数据源切换逻辑 通过 `@DS` 注解实现动态切换数据源: ```java @Service public class UserService { @Autowired private UserMapper userMapper; // 切换到 master 数据源 @DS("master") public List<User> getUsersFromMaster() { return userMapper.selectList(null); } // 切换到 slave1 数据源 @DS("slave1") public List<User> getUsersFromSlave1() { return userMapper.selectList(null); } } ``` #### 3. 常见问题及解决方案 ##### 3.1 数据源无法切换 **原因**:可能未正确配置 `@DS` 注解或未设置主数据源。 **解决方案**:确保 `application.yml` 中设置了 `primary` 属性,并在需要切换数据源的地方使用 `@DS` 注解指定目标数据源[^3]。 ##### 3.2 数据库连接池配置错误 **原因**:连接池参数配置不合理,可能导致连接超时或资源耗尽。 **解决方案**:根据业务需求调整连接池大小、空闲连接数等参数。例如: ```yaml spring: datasource: dynamic: datasource: master: hikari: maximum-pool-size: 20 idle-timeout: 30000 ``` ##### 3.3 事务管理失效 **原因**:动态数据源未正确注册到事务管理器中。 **解决方案**:确保在配置类中将 `DynamicDataSource` 实例注入到 `DataSourceTransactionManager` 中[^4]。 ##### 3.4 查询结果为空 **原因**:可能是数据源配置错误或表结构不一致。 **解决方案**:检查各数据源的 URL、用户名和密码是否正确,并确认表结构是否一致。 #### 4. 示例代码 以下是一个完整的动态数据源配置示例: ```java @Configuration public class DataSourceConfig { @Bean @ConfigurationProperties(prefix = "spring.datasource.dynamic") public DynamicDataSource dataSource() { return new DynamicDataSource(); } @Bean public DataSourceTransactionManager transactionManager(DynamicDataSource dynamicDataSource) { return new DataSourceTransactionManager(dynamicDataSource); } } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值