首页 文章

ReactiveCrudRepository在 Spring 天使用Hibernate

提问于
浏览
16

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

2 回答

  • 1

    是否可以将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是其第六个里程碑 . 见release article for details .

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

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

    As of now (Jan 2017) it is not possible.

    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,但仍会消耗线程的资源并在独立数据访问之间进行阻塞,因此只能实现被动方法的一小部分优势 .

  • 18

    根据之前的回答引用

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

    詹姆斯沃德声称它可以是非阻塞的 . 我的意思是我问他:

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

    他回答说

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

    source

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

相关问题