Новая ORM Visor: база данных как API для высоконагруженных систем

Новая ORM Visor: база данных как API для высоконагруженных систем
Новая ORM Visor: база данных как API для высоконагруженных систем (источник изображения)

Привет, Хабр! Меня зовут Сергей Сорокин, я .NET-разработчик с 12-летним стажем. Занимаюсь бэкендом, архитектурой и высокими нагрузками.

Проблема стандартных ORM

Знаю, о чем вы подумали, прочитав заголовок: «О боже, еще одна ORM? В 2025 году? Зачем, если есть Dapper и EF Core?»

Но когда ты работаешь в Enterprise-системах, где производительность критична, а база данных — это не просто хранилище, а мощный инструмент обработки данных, стандартные решения начинают показывать свои слабые места.

Философия: База данных как API

Сегодня я хочу рассказать о Visor — ORM, которую мы создали, чтобы превратить работу с базой данных в вызов типизированного API, убрать оверхед рефлексии и решить извечную боль с передачей списков (TVP) в SQL Server.

Мы пришли к концепции, где База данных выступает как сервис (API). Endpoint — это хранимая процедура или функция. Contract — это сигнатура процедуры и Table-Valued Parameters (TVP) или композитные типы (Postgres).

Почему Dapper и EF Core нам не подошли?

Мы искали инструмент, который сочетал бы удобство интерфейсов (как Refit для HTTP) и максимальную производительность (как ручной ADO.NET).

Претензия к Dapper

  • «Черный ящик» и боль с TVP
  • Runtime Reflection: Вся магия маппинга происходит в рантайме через IL Emit.
  • Table-Valued Parameters (TVP): Это главная боль.

Претензия к EF Core

  • Слишком тяжелый
  • Overhead: ChangeTracker, построение графов, Snapshots.

Visor: Концепция «White Box» (Прозрачный ящик)

Так родился Visor. Главная идея — Source Generators. Мы переносим всю работу по созданию SQL-команд, параметров и маппингу результатов с этапа выполнения (Runtime) на этап компиляции (Compile Time).

Киллер-фича: Zero Allocation TVP Streaming

Самое интересное — как мы реализовали передачу списков. Вместо создания DataTable (как это делают почти все), генератор создает код, который использует IEnumerable с yield return.

Бенчмарки: Момент истины

Мы сравнили вставку 10 000 записей в MS SQL Server через процедуру с TVP.

  • Visor (TVP Streaming)
  • EF Core 10 (Bulk Insert / AddRange)
  • Dapper (Стандартная вставка в цикле / Execute)

Результаты (BenchmarkDotNet):

  • Visor быстрее EF Core в 10 раз.
  • Visor быстрее Dapper (loop) в 800 раз.

Итоги

Мы создали инструмент не для того, чтобы «убить» EF Core или Dapper. Мы создали его для конкретной ниши: High-Load Enterprise системы, где база данных используется на полную мощность через хранимые процедуры.

Что дает Visor:

  • Скорость: Работает на уровне ручного ADO.NET.
  • Надежность: Строгая типизация и валидация схемы на этапе компиляции.
  • Чистота: Ваш код не зависит от деталей реализации доступа к данным.
  • Мульти-провайдерность: Сейчас поддерживается MSSQL и PostgreSQL.

Проект полностью Open Source. Если вам близок подход «Database as an API» или вы просто хотите посмотреть, как работают Source Generators в .NET 10 — добро пожаловать в репозиторий.

News Express Team
News Express Team

Команда News Express, состоящая из опытных редакторов и журналистов, предоставляет своевременные и надежные репортажи о российской политике, экономике, технологиях и мировых событиях с уникальной региональной точки зрения. Будьте в курсе событий с нашими преданными журналистами.

ru_RURU