ReactiveCrudRepository在春天使用Hibernate

时间:2017-01-05 10:56:09

标签: spring spring-data spring-data-jpa reactive

是否可以将Hibernate和Mysql与ReactiveCrudRepository而不是CrudRepository一起使用?我已经尝试过使用Spring Data Jpa和Hibernate的一些示例,但无法使其工作。我只能在ReactiveCrudRepository上为MongoDB和 cassandra 找到一些样本。

3 个答案:

答案 0 :(得分:31)

  

是否可以将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 (Reactive Relational Database Access) 是这样一个标准的提案。 希望它能帮助说服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刚刚发布了第一个里程碑。 请参阅the release article for its current capabilities

R2DBC已进入第6个里程碑。请参阅release article for details

另见答案:Why does Spring not provide reactive (non-blocking) clients for relational databases?

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

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

Spring Data的反应部分的当前相关版本为Spring Data Kay M1(您可以检查是否有更新的版本on the project home page

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

  

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

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

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

答案 1 :(得分:2)

根据之前回答的引用

  

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

詹姆斯·沃德声称它可以是无阻塞的。我的意思是我问过他:

  

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

他回答说

  

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

source

所以你可以通过用postgresql-async替换hibernate + spring数据来应对它(应该使用mysql)。

答案 2 :(得分:0)

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