spring-data-jpa ReactiveCrudRepository在 Spring 使用Hibernate

9q78igpj  于 2022-11-10  发布在  Spring
关注(0)|答案(4)|浏览(351)

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

ef1yzkbh

ef1yzkbh1#

是否可以将Hibernate和Mysql与ReactiveCrudRepository一起使用,而不是与CrudRepository一起使用?

TL;DR:

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

长版本

为什么不使用JPA?

JPA基于这样一种思想:将数据模型的一部分加载到内存中,操作生成的对象模型,然后让JPA转换这些更改。所有这些都在一个事务中完成。
这与处理React式存储的方式相反,在这种情况下,您尝试进行原子更改,并尝试将加载、处理和存储以及所有这些操作解耦,而不会阻塞。

为什么不使用JDBC?

所以我们必须看看JPA下面的技术层面:JDBC。但JDBC仍在阻塞:您向数据库发送一条SQL语句,然后JDBC将阻塞,直到您得到结果为止。这再次违背了React式的思想:永远不要阻塞。可以将其 Package 在线程池中以在某种程度上减轻这种情况,但这与其说是解决方案,不如说是一种变通方法。

为什么选择R2 DBC?

对于某些数据库,有一些合适的驱动程序可以用于React式存储库,但它们是专有的,因此不是一个很好的基础,最终应该在所有(相关)关系数据库中工作。
有一段时间Spring Data团队希望ADBA能填补这个空白,但是邮件列表上的讨论清楚地表明ADBA的目标不是React式的,而是异步的,同样不是我们需要的React式存储库抽象。
因此,在2018年初,生活在交叉点或React式和关系式的各种人决定,我们需要一个标准的React式数据库访问。
R2DBC (ReactiveRelationalDatabaseConnectivity)是这样一个标准的建议,希望它能帮助说服Oracle将ADBA转变为一种被动的方法,或者如果这没有发生,它本身也会成为标准。
现在已经有三个可用的实现,第二个选择的机会看起来很有希望。
R2 DBC本身主要是一个SPI,即由数据库提供者实现的API。SPI的设计方式对实现者的要求最低。但这也使R2 DBC使用起来有些麻烦。其想法是其他库将逐步建立在SPI之上为可用性而设计的库,就像JDBC一样。

Spring Data R2 DBC

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

项目状态

R2 DBC和Spring Data R2 DBC都还没有正式发布,至少需要几个月的时间才能发布。
Spring Data R2 DBC刚刚发布了第一个里程碑。请参阅the release article for its current capabilities
R2 DBC正在进行第六个里程碑。请参阅release article for details
另请参阅以下答案:为什么Spring不为关系数据库提供React式(非阻塞)客户端?

供考古学家参考的原始答案:

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

Spring Data的React性部分的当前相关版本是Spring Data Kay M1(您可以检查是否有更新的版本可用on the project home page
SpringData团队的一篇博客文章介绍了该版本,特别是其中的React性部分,文章开头是这样的(强调是我的):
Spring Data Kay M1是有史以来第一个支持React式数据访问的版本。它最初的一组支持的商店-- MongoDB、Apache Cassandra和Redis-都已经提供了React式驱动程序,这使得它们成为这样一个原型的自然候选者。
原因是没有标准的非阻塞方式来访问关系数据库,所以现在只支持那些支持这种API的。
可以使用JPA或JDBC实现ReactiveCrudRepository,并将工作委托给线程池。这将在外部提供一个异步API,但仍然会消耗线程的资源,并在独立的数据访问之间阻塞,因此只能实现被动方法的一小部分好处。

50few1ms

50few1ms2#

Hibernate启动了一个新的Hibernate Reactive子项目来支持响应式流,它提供了类似Hibernate/JPA的API来访问RDBMS。但不幸的是,目前Spring Data并不支持它。因此,没有针对Hibernate Reactive的ReactiveCrudRepoisoty
但是您可以自己将Hibernate与Spring集成,并获得响应式支持。
1.定义一个persistence.xml file,* 注意提供者类必须指定为Hibernate Reactive* 中的提供者类。
1.声明一个Mutiny.SessionFactory Bean。
1.然后将其注入到存储库类中。
我已经创建了a complete example演示Hibernate Reactive + Spring。

更新:到目前为止Spring团队还没有支持它的计划,如果你愿意尝试其他框架,可以看看Quarkus和Micronaun,它们都有无缝的HibernateReact式支持。看看我的Quarkus Hibernate Reactive exampleMicronaut Hibernate Reactive示例。

bis0qfac

bis0qfac3#

根据前面答复中的引述
可以使用JPA或JDBC实现ReactiveCrudRepository,并将工作委托给线程池。这将在外部提供一个异步API,但仍然会消耗线程的资源,并在独立的数据访问之间阻塞,因此只能实现React式方法的一小部分好处。
詹姆斯·沃德说它可以是非阻塞的。我的意思是我问他:
是的,但是ScalikeJDBC-Async不也是这样做的吗?只是把查询调用放到另一个线程池中?
他回答说
不可以,因为ScalalikeJDBC-Async使用https://github.com/mauricio...,它实际上是一个非阻塞(NIO)JDBCish数据库驱动程序。
来源
因此,您可以通过将hib + spring数据替换为postgresql-async(应该可以与mysql一起使用)来做出React。

j8ag8udp

j8ag8udp4#

你可以尝试使用quarkus框架和panache mongo HibernateReact式仓库。https://quarkus.io/guides/mongodb-panache。它很容易通过mongoDB管理一个React式仓库,这是以后的事情,但希望能有所帮助。

相关问题