30

是否可以使用 Hibernate 和 RDBMS(Mysql、Postgres 等)来ReactiveCrudRepository代替CrudRepository?我用 Spring Data Jpa 和 Hibernate 尝试了一些示例,但无法完成。我只能在ReactiveCrudRepositoryMongoDB 和cassandra上找到一些示例。

4

4 回答 4

61

是否可以使用 Hibernate 和 Mysql 来ReactiveCrudRepository代替CrudRepository

TL;博士:

不是使用 Hibernate 和 MySQL,而是使用R2DBC和 Postgres、Microsoft SQL Server 或 H2。看看Spring Data R2DBC

长版

为什么不是 JPA?

在包含 Hibernate/JPA 的情况下,这在可预见的将来不会发生。JPA 基于您将部分数据模型加载到内存中、操作生成的对象模型并让 JPA 转换这些更改的想法。所有这一切都在一次交易中完成。

这与处理响应式存储的方式相反,在这种存储中,您尝试进行原子更改并尝试将加载、处理和存储以及所有这些解耦而不会阻塞。

为什么不是 JDBC?

所以我们要看看JPA下面的技术层面:JDBC。但是 JDBC 仍然阻塞:您向数据库发送一条 SQL 语句,然后 JDBC 将阻塞,直到您得到结果。这再次违背了反应式的想法:永远不要阻塞。可以将其包装在线程池中以在一定程度上缓解这种情况,但这更像是一种变通方法而不是解决方案。

为什么选择 R2DBC?

有一些适用于某些数据库的驱动程序可用于反应式存储库。但它们是专有的,因此不是真正应该最终在所有(相关)关系数据库中工作的东西的良好基础。

有一段时间,Spring Data 团队希望ADBA能够填补这一空白。但是邮件列表上的讨论清楚地表明,ADBA 的目标不是响应式的,而是异步的。同样不是我们需要的响应式存储库抽象。

所以在 2018 年初,生活在交叉路口或反应式和关系式的各种人决定我们需要一个反应式数据库访问标准。

R2DBC(反应关系数据库连接是对 此类标准的提议。希望它要么有助于说服 Oracle 将 ADBA 转移到一种反应性方法,要么如果这种情况没有发生,它就会成为标准本身。

并且已经有了三个可用的实现,第二个选项看起来很有希望。

R2DBC 本身主要是一个SPI,即由数据库提供者实现的API。SPI 的设计方式对实施者的要求最低。但这也让 R2DBC 使用起来有些麻烦。这个想法是,其他库将加强并在该 SPI 之上构建为可用性而设计的库,就像 JDBC 发生的那样。

Spring Data R2DBC

Spring Data R2DBC 就是这样一个库,它提供了您所要求的:支持,ReactiveCrudRepository尽管它独立于 JPA/Hibernate,并且尚不支持 MySQL。

项目状况

R2DBC 和 Spring Data R2DBC 都还没有生产版本,至少需要几个月的时间才能到达那里。

Spring Data R2DBC 刚刚发布了第一个里程碑。有关其当前功能,请参阅发布文章。

R2DBC 是第 6 个里程碑。有关详细信息,请参阅发布文章

另请参阅此答案:为什么 Spring 不为关系数据库提供反应式(非阻塞)客户端?

原始答案作为考古学家的参考:

截至目前(2017 年 1 月),这是不可能的。

Spring Data 的响应式部分当前相关版本是 Spring Data Kay M1 (您可以在项目主页上 查看是否有更新的版本可用)

Spring Data 团队的一篇关于该版本的博客文章,特别是其中的反应部分以(强调我的)开头:

Spring Data Kay M1 是第一个支持响应式数据访问的版本。它最初支持的存储集——MongoDB、Apache Cassandra 和 Redis——都已经提供了响应式驱动程序,这使得它们成为此类原型的非常自然的候选者。

原因是没有标准的非阻塞方式来访问关系数据库。所以现在只支持那些支持这种 API 的。

可以ReactiveCrudRepository使用 JPA 或 JDBC 实现并将工作委托给线程池。这将在外部提供异步 API,但仍会消耗线程的资源并在独立数据访问之间阻塞,因此只能实现反应式方法的一小部分好处。

于 2017-01-07T06:12:56.277 回答
3

Hibernate 启动了一个新的Hibernate Reactive子项目,用于支持响应式流,它提供 Hibernate/JPA 类似的 API 来访问 RDBMS。但不幸的是,目前 Spring Data 不支持它。所以没有ReactiveCrudRepoisoty针对 Hibernate Reactive 的。

但是您可以自己将 Hibernate 与 Spring 集成并获得响应式支持。

  1. 定义一个persistence.xml 文件注意提供者类必须被指定为 Hibernate Reactive 中的那个
  2. 声明一个Mutiny.SessionFactorybean
  3. 然后将其注入您的存储库类。

我创建了一个完整的示例演示 Hibernate Reactive + Spring。

于 2021-08-26T11:14:59.773 回答
3

根据先前答案的引用

可以使用 JPA 或 JDBC 实现 ReactiveCrudRepository 并将工作委托给线程池。这将在外部提供异步 API,但仍会消耗线程的资源并在独立数据访问之间阻塞,因此只能实现反应式方法的一小部分好处。

James Ward 声称它可以是非阻塞的。我的意思是我问他:

是的,但是 ScalikeJDBC-Async 不完全一样吗?只是将查询调用放入另一个线程池?

他回答说

不,因为 ScalalikeJDBC-Async 使用https://github.com/mauricio ... 这实际上是一个非阻塞 (NIO) JDBCish 数据库驱动程序。

资源

因此,您可以通过用 postgresql-async 替换 hibernate + spring 数据来做出反应(应该与 mysql 一起使用)。

于 2017-03-02T11:28:18.420 回答
0

您可以尝试使用 quarkus 框架和 panache mongo hibernate 反应式存储库。https://quarkus.io/guides/mongodb-panache 。通过 mongoDB 管理响应式存储库很容易,稍后但希望有所帮助。

于 2020-10-18T14:34:56.753 回答