Во-первых, для описания действий с базой используется Free-монада
ConnectionIO, умеющая довольно многое (весь набор JDBC-операций + инстансы сильных тайпклассов из CE), но не умеющая таскать произвольный контекст, как это умеют ZIO, Env или ReaderT. Кроме того, ConnectionIO вшита в Transactor, выполняющий её интерпретацию в произвольный эффект и управляющий транзакцией.Во-вторых, достаточно полезная трейсинговая информация о выполнении SQL-запросов может быть передана только в
LogHandler - сайд-эффектящий обработчик вида LogEvent => Unit, что при использовании "в лоб" затрудняет идентификацию этих событий в логах.В-третьих, правильно дополнить транзакционную логику какими-нибудь посторонними (пусть и неоткатываемыми) эффектами в CE2 было непросто, а в CE3 стало очень сложно (возможно, напишу об этом отдельно).
В-четвертых, писать код с конкретной монадой — не наш путь. Особенно, если при попытке решить часть предыдущих проблем вместо
ConnectionIO приходится использовать что-то ещё более сложное.Хочется простого — работать с абстрактным DB-эффектом с поддержкой контекстного логирования и трассировки, ограничивая его способности только необходимыми баундами и алгебрами с бизнес-логикой. Главный вопрос — как?