ReactiveCrudRepository在春天使用Hibernate

Tho*_*ous 20 spring hibernate spring-data spring-data-jpa reactive

是否可以使用Hibernate和Mysql ReactiveCrudRepository代替CrudRepository?我已经尝试过使用Spring Data Jpa和Hibernate的一些示例,但无法使其工作.我只能ReactiveCrudRepository为MongoDB和cassandra找到一些样本.

Jen*_*der 38

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

TL; DR:

不是使用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(ř eactive ř elational d atabase CCESS) 是这样的标准的建议.希望它能帮助说服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是其第六个里程碑.查看详细信息发布文章.

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

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

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

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

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

Spring Data Kay M1是有史以来第一个支持反应式数据访问的版本.它最初支持的商店集合--MongoDB,Apache Cassandra和Redis--都已经发布了反应驱动程序,这使得它们非常适合这种原型.

原因是没有标准的非阻塞方式来访问关系数据库.因此,目前仅支持那些支持此类API的API.

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

  • @JensSchauder既然Hibernate有一个响应式版本(https://github.com/hibernate/hibernate-reactive),为什么JPA不支持它?像 JPA-Reactive 之类的东西? (3认同)
  • @dSebastien一年后有新闻。查看更新后的答案。 (2认同)

Han*_*tsy 6

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

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

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

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

更新:到目前为止 Spring 团队还没有计划支持它,如果你愿意尝试其他框架,请检查 Quarkus 和 Micronaunt,两者都有无缝的 Hibernate Reactive 支持。查看我的Quarkus Hibernate Reactive 示例Micronaut Hibernate Reactive示例。