h2 + mysql

    最近在做一个项目,由于出于各种考虑(如节省数据库空间,数据同步,便于操作...),大都会在一些字段上采取保存关联ID的做法,页面展示的时候就会通过转换的方式,显示关联ID的名称。如部门,职位等。

    如何通过ID得到相关的名称:

①通过连表查询的方式,这种方法相信大伙都不会认同的。

②通过在启动时将部门,职位,这些要高频查询的的表信息加载到缓存中,每次通过查询缓存就能得到显示的名称。但个人觉得每次要在内存中遍历这次数据,而且这些部门表,职位表比较大,感觉也不是一个最佳的方式。

③通过使用内存数据库,在启动时将mysql中的表加载在内存数据库中,查询的时候通过ID查询内存数据库,这比②少了在内存中遍历这个环节,虽然这会涉及连接内存数据库等开销,但感觉没必要再比较下去。

由于本项目只使用内存数据库的查询功能,且是适合windows平台部署,最终内存数据选择为:H2 。

最终:

如何整合h2到项目中呢:只要在项目中加入h2的开发jar包,就可以了,不需要h2的service端(若不是使用h2的内存模式,则要下载service端并进行启动相关服务)。

注意:

To keep the database open, add ;DB_CLOSE_DELAY=-1 to the database URL. 

为了让内存数据库一直开着,必须要在数据库地址后面加上;DB_CLOSE_DELAY=-1

若是数据库地址没有具体指定数据库名称则每次连接都会创建一个新数据db,so 应该在db url 后面指定具体名称,如 jdbc:h2:mem:db1

项目已经在使用,暂时能满足需求,并还没有出什么问题。

 

转载于:https://my.oschina.net/WWWW23223/blog/745550

### 如何在Spring Boot中使用WebFlux与MySQL实现响应式编程 #### 背景说明 Spring WebFlux 是一种基于反应式编程模型的框架,支持非阻塞式的 I/O 操作。然而,MySQL 并未原生提供完全兼容反应式模式的支持[^4]。为了克服这一限制,开发者通常会借助第三方库来模拟 MySQL 的反应式行为。 --- #### 解决方案概述 以下是将 Spring WebFlux 和 MySQL 结合使用的常见方法: 1. **R2DBC(Reactive Relational Database Connectivity)** R2DBC 提供了一种标准的方式来连接关系型数据库并执行反应式操作。它是专门为反应式编程设计的一种驱动程序接口。 2. **H2 或其他内存数据库作为替代测试环境** 如果需要验证反应式逻辑,在开发阶段可以选择 H2 数据库或其他支持反应式特性的数据库进行调试。 3. **MyBatis-Reactor 或 JdbcClient 工具** 对于某些场景下无法直接切换到 R2DBC 的情况,可以通过 MyBatis-Reactor 或者 `JdbcClient` 来间接实现部分功能。 --- #### 实现步骤详解 ##### 1. 添加必要的依赖项 在项目的 `pom.xml` 文件中引入以下依赖项: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-r2dbc</artifactId> </dependency> <!-- MySQL Connector --> <dependency> <groupId>io.r2dbc</groupId> <artifactId>r2dbc-mysql</artifactId> <scope>runtime</scope> </dependency> ``` 这些依赖分别用于启用 Spring Data R2DBC 支持以及加载针对 MySQL 的反应式驱动器[^3]。 ##### 2. 配置数据源 创建配置文件以设置 R2DBC 连接参数。例如,在 `application.properties` 中添加如下内容: ```properties spring.r2dbc.url=r2dbc:mysql://localhost:3306/your_database_name spring.r2dbc.username=your_username spring.r2dbc.password=your_password ``` 注意这里的 URL 使用的是 `r2dbc:mysql://` 协议前缀而不是传统的 JDBC 形式。 ##### 3. 创建实体类和 Repository 接口 定义一个简单的实体对象及其对应的仓库接口: ```java import org.springframework.data.annotation.Id; import org.springframework.data.relational.core.mapping.Table; @Table("users") public class User { @Id private Long id; private String name; // Getters and Setters omitted for brevity. } ``` 接着声明 repository 层代码: ```java import org.springframework.data.repository.reactive.ReactiveCrudRepository; public interface UserRepository extends ReactiveCrudRepository<User, Long> {} ``` 通过继承自 `ReactiveCrudRepository` 类型,可以直接获得一系列基本 CRUD 方法的操作能力。 ##### 4. 编写 Controller 控制层逻辑 最后一步是在控制器端调用上述服务完成业务需求。下面展示了一个样例片段: ```java @RestController @RequestMapping("/api/users") public class UserController { private final UserRepository userRepository; public UserController(UserRepository userRepository) { this.userRepository = userRepository; } @GetMapping("") public Flux<User> getAllUsers() { return userRepository.findAll(); } } ``` 此处利用了 Reactor 库中的 `Flux<T>` 表达多个结果集返回形式;如果仅需单条记录则采用 `Mono<T>` 替代之[^1]。 --- #### 技术挑战分析 尽管理论上可行,但在实际项目实施过程中仍可能存在若干难点: - 当前主流的关系型数据库管理系统尚未全面拥抱真正的反应堆架构理念; - 性能瓶颈可能出现在高并发读写的极端条件下; - 开发团队成员对于新兴技术栈的学习曲线陡峭等问题均值得重视考虑。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值