在使用 Spring JDBC 时效果很好,并且在使用批处理时对 JPA 有一些改进。
当您已经拥有Spring JDBC时,我很想了解为什么要使用Spring Data JDBC 。
当您已经拥有Spring JDBC时,我很想了解为什么要使用R2DBC。
在使用 Spring JDBC 时效果很好,并且在使用批处理时对 JPA 有一些改进。
当您已经拥有Spring JDBC时,我很想了解为什么要使用Spring Data JDBC 。
当您已经拥有Spring JDBC时,我很想了解为什么要使用R2DBC。
当您使用 R2DBC 很容易时,就是在您构建一个非阻塞的应用程序时。堆栈中的所有内容都必须是非阻塞的,包括数据库驱动程序。JDBC 本质上是阻塞的,人们尝试使用方案来绕过它,但效果并不好。如果您不构建非阻塞应用程序,则不会使用 R2DBC。
关于何时使用 Spring Data JDBC 的部分,看起来它为您提供了一种更简单的方法来创建存储库和映射数据,只要您对他们自以为是的框架感到满意,您就可以不用拥有所有复杂的映射使用 JPA,并且您需要 DDD 概念(如聚合根)。否则 Spring JDBC 需要更多代码来创建数据访问对象,但可能会提供更多控制权。https://docs.spring.io/spring-data/jdbc/docs/2.2.4/reference/html/#reference详细描述了为什么要使用 Spring Data JDBC。这是简单与控制。
这三种技术在不同的抽象级别上工作。
R2DBC是JDBC的替代品。它是反应式的,即非阻塞式。您将语句发送到服务器,继续工作并最终将结果作为事件接收。它通常用于更好地扩展的能力。但是使用它更复杂,因为它是异步的,基本上你的完整应用程序也应该是这样才能获得好处。与 JDBC 一样,您可能不想单独使用它。
Spring JDBC与Spring R2DBC相媲美,两者都隐藏了一些比较繁琐的底层技术细节。它们都提供了对底层技术的完全访问权限,并为您提供了更愉快的开发人员体验。
Spring Data JDBC是一个基于 Repository 抽象的对象关系映射器 (ORM)。对于响应式世界,还有Spring Data R2DBC,它与 Spring Data JDBC 共享代码和属性。它基本上是 Spring Data JPA 的替代品。有关 Spring Data JDBC 和 Spring Data JPA 的比较,请参见https://stackoverflow.com/a/42488593/66686。Spring Data 的 Repository 抽象来自领域驱动设计。您可以将存储库视为由某种持久性机制支持的集合。该集合的元素不仅是实体,而且是聚合,它们属于一起并且本身没有意义。一个典型的例子是带有行项目的采购订单。如果没有采购订单,订单项就没有多大意义。
这种方法对域模型的设计施加了一些限制。作为回报,您会为您的域模型获得一个干净整洁的结构。Spring Data JDBC 和 Spring Data R2DBC 都允许将它们与 Spring JDBC 和 Spring R2DBC 自由组合。这对于 JPA 非常不同,一切都建立在它之上,因为 JPA 有一个缓存作为系统的组成部分,当您在单个事务中混合 JPA 和直接 JDBC 访问时,这将产生有趣的效果。
有关所讨论的不同技术的概述,请参见下表。
堆 | JDBC 到 Spring Data JDBC | R2DBC 到 Spring Data R2DBC | JDBC 到 Spring Data JPA |
---|---|---|---|
底层 API | JDBC | R2DBC | JDBC |
可用性层 | 弹簧 JDBC | 弹簧 R2DBC | 弹簧 ORM (*) |
甲骨文 | 弹簧数据 JDBC | Spring Data R2DBC | JPA |
存储库抽象 | 弹簧数据 JDBC | Spring Data R2DBC | 春季数据 JPA |
沟通方式 | 同步 | 反应式 | 同步 |
(*) Spring ORM 位于 JPA 或其他 Spring 独立 ORM 技术之上,因此在此表中它应该低于 JPA。