SQLite и GoLang
Запись от sqltd1 размещена 28.05.2022 в 11:59
Показов 1871
Комментарии 0
|
Краткий обзор драйверов. Тонкий момент в теме "SQLite и GoLang" состоит в том, что SQLite является встраиваемым движком БД. Когда БД находится где-то там далеко, и нужно выполнить кучу быстрых запросов, осознаешь, что накладные расходы на взаимодействие с сервером могут быть достаточно велики и смиряешься с этим. С другой стороны, когда движок БД является встроенным в приложение, надеешься на то, что у тебя все будет летать. Драйвера SQLite для GoLang подразделяются на нативные, реализованные на GoLang, и подключаемые через CGO (подсистема Go для подключения библиотек, написанных на C. CGO-драйверы Автор mattn Наиболее известный (5700 звезд на гитхабе) - это драйвер от mattn https://github.com/mattn/go-sqlite3 Он релизует стандартный интерфейс database/sql. Это безусловный плюс, кроме того, mattn активно участвует в жизни GoLang сообщества, и этот проект активно поддерживается. Минусы начинают вылезать если вы хотите выполнять большое количество быстрых запросов. Прослойки database/sql и CGO отнюдь не способствуют увеличению скорости. Из интересных особенностей - добавлена возможность добавления виртуальных таблиц и пользовательских функций. Но наличие замедляющих прослоек делают эти возможности бессмысленными (особенно это относится к пользовательским функциям). Я достаточно активно использовал и использую этот драйвер. Автор crawshaw Второй по популярности (430 звезд на гитхабе) - https://github.com/crawshaw/sqlite Этот драйвер обеспечивает доступ к значительной части API SQLite из GoLang. То есть прослойка database/sql в этом случае исключается. Но придется разбираться не с простым и общим API database/sql, а уже с API SQLite. Плюсы - слегка увеличившаяся скорость (вау-эффекта нет, просто быстрее процентов на 20). Если нужно получать доступ к специфическому функционалу SQLite, то этот драйвер предоставляет много возможностей (но покрытие не полное). Разработчик активно использует его в своих разработках и честно предупреждает, что тот функционал API SQLite, который ему нужен, он реализовал, расширять функционал он будет, только если это его заинтересует. Похоже, что в последнее время его интересы сместились в другую область. Я его пробовал, но и только. Для меня существенным является совместимость с database/sql. Нативные драйверы. Появились совсем недавно. Автор modernc Драйвер modernc - это порт SQLite c C на Go. За счет отсутствия CGO должен показывать более хорошие результаты на коротких запросах. Я тестировал его примерно в октябре 2021 года. К сожалению результаты тестов не впечатлили (процентов на 10-20 медленнее, чем при использовании драйвера от mattn). Документация находится здесь https://pkg.go.dev/modernc.org/sqlite. Проект активно развивается. К сожалению, текущую версию протестировать сейчас лень, поскольку я в последнее время сделал ставку на duckDB и все время уходит на него. Автор zombiezen После того, как информация о появлении драйвера от modernc разошлась, последователи модифицировали и драйвер от crawshaw, благо там вставок на C было значительно меньше. Этот проект доступен здесь https://github.com/zombiezen/go-sqlite Ну и напоследок об эксперименте cvilsmeier Интересный не CGO способ предложил https://github.com/cvilsmeier/sqinn-go Здесь имеется SQLite-сервис (Обертка вокруг SQLite для обеспечения взаимодействия через stdin/stdout). Чистый C. GoLang-приложение должно запустить его как дочерний процесс и взимодействовать с ним через stdin/stdout. Тесты, выполненные cvilsmeier, показывают сопоставимую производительность с драйверами от mattn и crawshaw. Из плюсов следует отметить простоту построения многоплатформенных приложений. Я посмотрел реализацию протокола взаимодействия - очень примитивный. Как мне кажется у такого подхода имеется большой потенциал в плане увеличения производительности. В общем, спасибо cvilsmeier за публичное обсуждение идеи с предоставлением работающего образца. |
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии


