ruoyi实用性改造--(四)选择数据源及非标准使用数据库

一、实用型数据直接访问

/** 使用Druid中 application-druid.yml 中定义的副数据源
         Connection con=null;

         //手工调用Druid的配置访问
         Connection con2=null;
         try {
             //DruidDataSource ds = SpringUtils.getBean("masterDataSource");
             DruidDataSource ds = SpringUtils.getBean("slaveDataSource");
             // 获取一个连接
             con2=ds.getConnection();
             // 执行一个查询,查询user表中的记录数
             ResultSet rs=con2.prepareStatement(" select uuid() ").executeQuery();
             // 遍历查询结果
             while (rs.next()){
                 String str=rs.getString(1);
                 System.out.println("H2生成的uuid(): " + str);
             }
         } catch (SQLException e) {
             throw new RuntimeException(e);
         } finally {
             // 关闭连接
             if(con2!=null && ! (con2.isClosed())) try {
                 con2.close();
             } catch (SQLException e) {
                 throw new RuntimeException(e);
             }
         }

 */

/** 按代码中手动写数据库链接配置访
### 数据源动态加载方法 在 RuoYi-Vue-Plus 中,为了支持从数据库中动态加载数据源的功能,通常采用 Spring Boot 的 `AbstractRoutingDataSource` 或者自定义的数据源切换逻辑来实现。以下是具体的实现方式: #### 1. **配置文件中的初始数据源** 在项目的 `application.yml` 文件中,可以预先设置默认的核心数据源(Core DataSource)。该核心数据源用于连接到存储其他动态数据源信息的表。 ```yaml spring: datasource: core: jdbc-url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true username: root password: 12345678 ``` 此部分配置为核心数据源的信息[^1]。 --- #### 2. **创建动态数据源管理类** 通过继承 `AbstractRoutingDataSource` 类或者手动维护一个线程安全的 Map 来保存动态数据源实例。 ##### 动态数据源工具类代码示例: ```java import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; public class DynamicDataSource extends AbstractRoutingDataSource { private static final ThreadLocal<String> CONTEXT_HOLDER = new ThreadLocal<>(); public void setDataSourceKey(String key) { CONTEXT_HOLDER.set(key); } @Override protected Object determineCurrentLookupKey() { return CONTEXT_HOLDER.get(); } } ``` 在此处实现了基于当前线程上下文决定使用哪个数据源的关键逻辑[^2]。 --- #### 3. **初始化动态数据源** 当应用启动时,可以通过读取数据库中的配置表(例如 `sys_datasource` 表),将其中记录的所有数据源信息注册到动态数据源容器中。 ##### 初始化逻辑伪代码: ```java @Service public class DataSourceInitService { @Autowired private DruidDynamicDataSource dynamicDataSource; @PostConstruct public void initDatasourcesFromDB() { List<SysDataSourceEntity> sysDataSources = dataSourceRepository.findAll(); // 假设有一个 Repository 查询所有数据源 sysDataSources.forEach(sysDataSource -> { HikariDataSource ds = createDataSource(sysDataSource.getUrl(), sysDataSource.getUsername(), sysDataSource.getPassword()); dynamicDataSource.addDataSource(sysDataSource.getName(), ds); // 将新数据源加入动态池 }); } private HikariDataSource createDataSource(String url, String username, String password) { HikariConfig config = new HikariConfig(); config.setJdbcUrl(url); config.setUsername(username); config.setPassword(password); return new HikariDataSource(config); } } ``` 这段代码展示了如何从数据库中获取多个数据源并将其注入到动态数据源管理器中[^3]。 --- #### 4. **切换单个请求使用数据源** 在实际业务场景下,可能需要根据某些条件(如租户 ID、模块名等)动态切换数据源。这一步骤通常是通过拦截器或 AOP 实现的。 ##### 切换数据源的拦截器示例: ```java @Component public class DataSourceInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String tenantId = request.getHeader("X-Tenant-ID"); // 获取租户ID或其他标识符 if (StringUtils.hasText(tenantId)) { DynamicDataSourceContextHolder.setDataSourceKey(tenantId); // 设置对应的数据源键值 } return true; } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { DynamicDataSourceContextHolder.clearDataSourceKey(); // 清理线程变量 } } ``` 以上代码片段说明了如何利用 HTTP 请求头传递参数完成数据源选择操作[^4]。 --- #### 总结 综上所述,在 RuoYi-Vue-Plus 项目中实现从数据库加载数据源的主要思路包括以下几个方面: 1. 使用静态配置作为核心数据源; 2. 创建动态数据源管理组件,并扩展其行为以适应多数据源需求; 3. 在程序运行期间实时更新可用数据源列表; 4. 结合具体业务规则灵活调整每次查询所依赖的具体数据源。 这种设计模式不仅增强了系统的灵活性,还能够很好地满足分布式架构下的复杂应用场景。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值