[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-reactive-chto-takoe-r2dbc-i-kak-on-svyazan-s-reaktivnym-programmirovaniem":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":15,"progress":16,"seo":17},1002,"chto-takoe-r2dbc-i-kak-on-svyazan-s-reaktivnym-programmirovaniem",31,"reactive","Reactive","⚡","Что такое R2DBC и как он связан с реактивным программированием?","R2DBC (Reactive Relational Database Connectivity) — спецификация для реактивного, неблокирующего доступа к реляционным базам данных, решающая проблему блокирующего JDBC в реактивном стеке.\n\n### Проблема JDBC в реактивном контексте\n\nJDBC полностью блокирующий — каждый запрос к БД блокирует поток до получения ответа. В реактивных приложениях (WebFlux + Netty) это блокирует event-loop поток и нивелирует все преимущества реактивности.\n\n### Архитектура\n\n```\nПриложение -> Spring Data R2DBC -> R2DBC SPI -> R2DBC Driver -> База данных\n```\n\n### Поддерживаемые базы данных\n\n- PostgreSQL (`r2dbc-postgresql`)\n- MySQL \u002F MariaDB (`r2dbc-mysql`, `r2dbc-mariadb`)\n- Microsoft SQL Server (`r2dbc-mssql`)\n- H2 (`r2dbc-h2`)\n- Oracle (`oracle-r2dbc`)\n\n\u003Cdetails>\u003Csummary>Настройка и использование Spring Data R2DBC\u003C\u002Fsummary>\n\n```yaml\nspring:\n  r2dbc:\n    url: r2dbc:postgresql:\u002F\u002Flocalhost:5432\u002Fmydb\n    username: user\n    password: secret\n```\n\n```java\n\u002F\u002F Сущность\n@Table(\"users\")\npublic record User(\n    @Id Long id,\n    String name,\n    String email\n) {}\n\n\u002F\u002F Реактивный репозиторий\npublic interface UserRepository extends ReactiveCrudRepository\u003CUser, Long> {\n\n    Flux\u003CUser> findByName(String name);\n\n    @Query(\"SELECT * FROM users WHERE email = :email\")\n    Mono\u003CUser> findByEmail(String email);\n}\n\n\u002F\u002F Использование в сервисе\n@Service\npublic class UserService {\n    private final UserRepository userRepository;\n\n    public Mono\u003CUser> createUser(User user) {\n        return userRepository.save(user);\n    }\n\n    public Flux\u003CUser> findAll() {\n        return userRepository.findAll();\n    }\n}\n```\n\n\u003C\u002Fdetails>\n\n\u003Cdetails>\u003Csummary>DatabaseClient — низкоуровневый доступ\u003C\u002Fsummary>\n\n```java\n@Service\npublic class CustomUserRepository {\n    private final DatabaseClient databaseClient;\n\n    public Flux\u003CUser> searchUsers(String query) {\n        return databaseClient.sql(\"SELECT * FROM users WHERE name LIKE :query\")\n            .bind(\"query\", \"%\" + query + \"%\")\n            .map(row -> new User(\n                row.get(\"id\", Long.class),\n                row.get(\"name\", String.class),\n                row.get(\"email\", String.class)))\n            .all();\n    }\n}\n```\n\n\u003C\u002Fdetails>\n\n### R2DBC vs JDBC\n\n| Критерий | JDBC | R2DBC |\n|----------|------|-------|\n| Модель | Блокирующая | Неблокирующая, реактивная |\n| Возвращаемые типы | ResultSet, List | Mono, Flux |\n| Пул соединений | HikariCP | r2dbc-pool |\n| ORM | Hibernate\u002FJPA | Spring Data R2DBC (без lazy loading) |\n| Зрелость | 25+ лет | ~5 лет |\n| Транзакции | @Transactional | @Transactional (реактивный менеджер) |\n\n### Частые ошибки\n\n- Ожидать от R2DBC возможностей JPA — нет lazy loading, entity graph, dirty checking\n- Использовать блокирующие драйверы рядом с R2DBC — один блокирующий вызов нивелирует реактивность\n- Не настраивать пул соединений — без r2dbc-pool создаётся новое соединение на каждый запрос\n- Сложные JOIN-запросы — R2DBC не маппит связи автоматически; нужен DatabaseClient или проекции\n\n### Как используется в 2026\n\n- R2DBC зрелый для PostgreSQL и MySQL\n- С Virtual Threads (Java 21) обычный JDBC + HikariCP — конкурентная альтернатива\n- R2DBC оправдан в полностью реактивных приложениях (WebFlux + reactive messaging + R2DBC)\n- Тренд: для новых проектов без жёстких требований к реактивности — JDBC + Virtual Threads проще\n\n> **На собеседовании:** ключевое — объяснить, зачем нужен R2DBC (JDBC блокирует event-loop в WebFlux) и чем он отличается от JPA (нет lazy loading, нет каскадирования). Частая ошибка — не упомянуть альтернативу: JDBC + Virtual Threads, которая проще и покрывает большинство сценариев.","","middle",[7],[],null,{"title":18,"description":19,"ogTitle":18,"ogDescription":20,"keywords":21,"schemaAnswer":22,"featuredSnippetReady":23},"Что такое R2DBC и как он связан с реактивным программировани — Gymterview","R2DBC (Reactive Relational Database Connectivity) — спецификация для реактивного, неблокирующего доступа к реляционным базам данных, решающая проблему блокирующ","R2DBC (Reactive Relational Database Connectivity) — спецификация для реактивного, неблокирующего доступа к реляционным б",[7,13],"R2DBC (Reactive Relational Database Connectivity) — спецификация для реактивного, неблокирующего доступа к реляционным базам данных, решающая проблему блокирующего JDBC в реактивном стеке.",true]