litedb vs sqlite
От: vaa  
Дата: 17.08.21 03:32
Оценка:
litedb активно развивается, много звезд. удобен в первом приближении.
опасение — много открытых багов. возможность наступить на грабли по незнанию.

sqlite — классический, проще работать со структурой, но сложнее внедрить в проект особенно в конфигурации any cpu.
требуется написание ado-прослойки для манипуляции с данными.

Кто-нибудь использует litedb в проде?
Что выбрать для хранения промежуточных данных для настольного приложения?

Слегка разочарован. лайтдб работает только с get\set свойствами.
вообщем любой автомат имеет оборотную сторону.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Отредактировано 18.08.2021 7:47 Разраб . Предыдущая версия .
Re: litedb vs sqlite
От: VladCore  
Дата: 17.08.21 07:33
Оценка: 6 (1) +1
Здравствуйте, vaa, Вы писали:

vaa>litedb активно развивается, много звезд. удобен в первом приближении.

vaa>опасение — много открытых багов. возможность наступить на грабли по незнанию.

vaa>sqlite — классический, проще работать со структурой, но сложнее внедрить в проект особенно в конфигурации any cpu.


неа. как раз вопросом "any cpu" занимается microsoft. смотри, она собирает оптимизиранную и независимую от os sqlite под каждый runtime.

vaa>требуется написание ado-прослойки для манипуляции с данными.


необязательно. юзай напрямую с entity framework. не юзай ado если не знаеш зачем он.
Re[2]: litedb vs sqlite
От: vaa  
Дата: 17.08.21 09:19
Оценка:
Здравствуйте, VladCore, Вы писали:



VC>неа. как раз вопросом "any cpu" занимается microsoft. смотри, она собирает оптимизиранную и независимую от os sqlite под каждый runtime.

разве? native dll отдельно всегда идут в папки x86 x64. может я не ту версию использовал.
Там другая проблема. когда System.Data.SQLite.Core в отдельном от главного проекте, то при сборке SQLite.Interop.dll не копируется автоматом в выходной каталог приложения.
у меня этим отдельная таска занимается.



VC>необязательно. юзай напрямую с entity framework. не юзай ado если не знаеш зачем он.


По опыту работы с entity framework, ado намного проще, тут вопрос в том что litedb как раз в разы проще.
смущает только что с такой моделью не работал, там миграции всякие и прочее.
плюс еще зависимости. чтобы более менее комфортно работать в склайт нужен еще даппер и даппер-контриб.
Бенчил. без транзакции намного быстрее лайтдб, с транзакциями 17/14 выигрывает склайт. т.е. тут более менее все ровно.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[3]: litedb vs sqlite
От: VladCore  
Дата: 17.08.21 10:08
Оценка: +3
>Здравствуйте, vaa, Вы писали:

VC>>неа. как раз вопросом "any cpu" занимается microsoft. смотри, она собирает оптимизиранную и независимую от os sqlite под каждый runtime.

vaa>разве? native dll отдельно всегда идут в папки x86 x64. может я не ту версию использовал.

есть еще мас ос и линукс

vaa>Там другая проблема. когда System.Data.SQLite.Core в отдельном от главного проекте, то при сборке SQLite.Interop.dll не копируется автоматом в выходной каталог приложения.

vaa>у меня этим отдельная таска занимается.

не. эта проблема только у тебя в голове. чего не юзаеш Microsoft.Data.Sqlite, она any cpu

System.Data.SQLite.Core (от SQLite) ей 8 месяцев всего. зачем она? есть же Microsoft.Data.Sqlite


VC>>необязательно. юзай напрямую с entity framework. не юзай ado если не знаеш зачем он.


vaa>По опыту работы с entity framework, ado намного проще, тут вопрос в том что litedb как раз в разы проще.


ты написал "требуется написание ado-прослойки для манипуляции с данными." а теперь ado намного проще?

vaa>смущает только что с такой моделью не работал, там миграции всякие и прочее.

vaa>плюс еще зависимости. чтобы более менее комфортно работать в склайт нужен еще даппер и даппер-контриб.

у тебя еще и с dapper проблема?

vaa>Бенчил. без транзакции намного быстрее лайтдб, с транзакциями 17/14 выигрывает склайт. т.е. тут более менее все ровно.



не морочь людям голову. попробуй разбить на несколько вопросов — крофссплатформенность, сфера принименения и производительность.
Re[3]: litedb vs sqlite
От: Sharov Россия  
Дата: 17.08.21 22:04
Оценка:
Здравствуйте, vaa, Вы писали:


VC>>неа. как раз вопросом "any cpu" занимается microsoft. смотри, она собирает оптимизиранную и независимую от os sqlite под каждый runtime.

vaa>разве? native dll отдельно всегда идут в папки x86 x64. может я не ту версию использовал.
vaa>Там другая проблема. когда System.Data.SQLite.Core в отдельном от главного проекте, то при сборке SQLite.Interop.dll не копируется автоматом в выходной каталог приложения.
vaa>у меня этим отдельная таска занимается.

Зачем таска,когда copy always достаточно? Или речь о nuget? Там возможны приседания.
Кодом людям нужно помогать!
Re[4]: litedb vs sqlite
От: Sharov Россия  
Дата: 17.08.21 22:06
Оценка:
Здравствуйте, VladCore, Вы писали:

VC>не. эта проблема только у тебя в голове. чего не юзаеш Microsoft.Data.Sqlite, она any cpu


К anycpu нужны соотв. interop dll'ки.
Кодом людям нужно помогать!
Re[5]: litedb vs sqlite
От: VladCore  
Дата: 18.08.21 01:00
Оценка:
Здравствуйте, Sharov, Вы писали:

VC>>не. эта проблема только у тебя в голове. чего не юзаеш Microsoft.Data.Sqlite, она any cpu


S>К anycpu нужны соотв. interop dll'ки.


еще их нужно положить в нужное время в нужное место.
Re[4]: litedb vs sqlite
От: vaa  
Дата: 18.08.21 01:28
Оценка:
Здравствуйте, Sharov, Вы писали:


S> Или речь о nuget? Там возможны приседания.


Совершенно верно, как я и писал, ссылка на пакет в зависимом проекте, при сборке каталоги с нативками не копируются в выходной каталог главного проекта.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[4]: litedb vs sqlite
От: vaa  
Дата: 18.08.21 01:47
Оценка:
Здравствуйте, VladCore, Вы писали:



VC>не. эта проблема только у тебя в голове. чего не юзаеш Microsoft.Data.Sqlite, она any cpu

попробовал, да, работает, но отдельно требует "батарейки" (без шуток — нужно гуглить в каком пакете они есть, на мсдн ни намека на это).
речь конечно о net472.

VC>System.Data.SQLite.Core (от SQLite) ей 8 месяцев всего. зачем она? есть же Microsoft.Data.Sqlite


Может на нугете она недавно, а сама библиотека гораздо старше.

VC>ты написал "требуется написание ado-прослойки для манипуляции с данными." а теперь ado намного проще?

просто хотел сказать что без знания адо сложно пользоваться ЭФ.

VC>у тебя еще и с dapper проблема?

Р. Мартин советует избегать ненужных зависимостей.

VC>не морочь людям голову. попробуй разбить на несколько вопросов — крофссплатформенность, сфера принименения и производительность.

постараюсь. речь конечно об удобстве разработки приложения.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re: litedb vs sqlite
От: Ночной Смотрящий Россия  
Дата: 18.08.21 14:00
Оценка: 26 (2)
Здравствуйте, vaa, Вы писали:

Это несравнимые вещи. sqlite это почти полноценная РСУБД, а litedb это просто движок персистентных данных с минимальным функционалом.

vaa>litedb активно развивается, много звезд. удобен в первом приближении.


Так развивается, что до сих пор async методов не завезли, это в 2021 то году. На практике — легко и непринужденно портит файл БД, т.е. пригоден только для хранения не особо ценных данных.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[2]: Async
От: Qbit86 Кипр
Дата: 18.08.21 14:16
Оценка: 1 (1)
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Так развивается, что до сих пор async методов не завезли, это в 2021 то году.


Так в SQLite и Microsoft.Data.Sqlite тоже не завезли:

SQLite doesn't support asynchronous I/O. Async ADO.NET methods will execute synchronously in Microsoft.Data.Sqlite. Avoid calling them.
— https://docs.microsoft.com/en-us/dotnet/standard/data/sqlite/async

Глаза у меня добрые, но рубашка — смирительная!
Re[3]: Async
От: Sharov Россия  
Дата: 18.08.21 14:39
Оценка: +1
Здравствуйте, Qbit86, Вы писали:

Q>Здравствуйте, Ночной Смотрящий, Вы писали:


НС>>Так развивается, что до сих пор async методов не завезли, это в 2021 то году.

Q>Так в SQLite и Microsoft.Data.Sqlite тоже не завезли:
Q>

SQLite doesn't support asynchronous I/O. Async ADO.NET methods will execute synchronously in Microsoft.Data.Sqlite. Avoid calling them.
Q>— https://docs.microsoft.com/en-us/dotnet/standard/data/sqlite/async



https://www.sqlite.org/asyncvfs.html
Кодом людям нужно помогать!
Re[4]: Async
От: MadHuman Россия  
Дата: 21.08.21 09:16
Оценка: 5 (1)
Здравствуйте, Sharov, Вы писали:

S>Здравствуйте, Qbit86, Вы писали:


Q>>Здравствуйте, Ночной Смотрящий, Вы писали:


НС>>>Так развивается, что до сих пор async методов не завезли, это в 2021 то году.

Q>>Так в SQLite и Microsoft.Data.Sqlite тоже не завезли:
Q>>

SQLite doesn't support asynchronous I/O. Async ADO.NET methods will execute synchronously in Microsoft.Data.Sqlite. Avoid calling them.
Q>>— https://docs.microsoft.com/en-us/dotnet/standard/data/sqlite/async



S>https://www.sqlite.org/asyncvfs.html

По ссылке не та асинхронность которая обычно имеется ввиду.
Там говорится, о том что операции записи помещаются в отдельную очередь и затем фоновым потоком выполняются,
основной вызов (который вызывает запись) при этом не блокируется и завершается не дожидаясь физического окончания записи — это и имеется в виду под асинхронностью.


Но возникают вопросы.
А зачем это вообще надо? Если ОС и так поддерживает асинхронную запись. То есть запись сначала происходит в кэш ОС и ОС затем сама в фоне флушит буфера на диск.
С учетом этого и потребность в .net асинхронности сомнительна при операциях записи, тк вызов по сути отрабатывает синхронно и никакого ожидания (без выполнения работы) в нём не происходит.
Re[5]: Async
От: Sharov Россия  
Дата: 24.08.21 09:25
Оценка:
Здравствуйте, MadHuman, Вы писали:

S>>https://www.sqlite.org/asyncvfs.html

MH>По ссылке не та асинхронность которая обычно имеется ввиду.

Асинхронность одна и та же, просто механизмы разные -- отдельный поток или non-blocking io (через callback).



MH>Но возникают вопросы.

MH>А зачем это вообще надо? Если ОС и так поддерживает асинхронную запись. То есть запись сначала происходит в кэш ОС и ОС затем сама в фоне флушит буфера на диск.

Так речь идет не просто о записи, а о бд, т.е. у нас здесь consistency и durability. Возможно, что с ними будут проблемы при использовании
кэшей ОС. Напрямую надежнее.

MH>С учетом этого и потребность в .net асинхронности сомнительна при операциях записи, тк вызов по сути отрабатывает синхронно и никакого ожидания (без выполнения работы) в нём не происходит.


Не понял этот фрагмент -- почему синхронно и почему никакого ожидания не происходит (кого, в чем ?) ?
Кодом людям нужно помогать!
Re[6]: Async
От: MadHuman Россия  
Дата: 25.08.21 07:37
Оценка:
Здравствуйте, Sharov, Вы писали:

S>Здравствуйте, MadHuman, Вы писали:


S>>>https://www.sqlite.org/asyncvfs.html

MH>>По ссылке не та асинхронность которая обычно имеется ввиду.

S>Асинхронность одна и та же, просто механизмы разные -- отдельный поток или non-blocking io (через callback).

я хотел сказать что разница в следующем — в 1-м случае работа запускается асинхронно и будет сделана позже и вызывающая
сторона не ждет и никак не узнает что работа зафейлилась (что довольно редко в рассматриваемом кейсе).
а во 2-м (то что в .net обычно подразумевают под асинхронностью, через калбэк) — вызывающая сторона асинхронно ожидает завершения работы
и если что не так, то получит ошибку и может обработать.



MH>>С учетом этого и потребность в .net асинхронности сомнительна при операциях записи, тк вызов по сути отрабатывает синхронно и никакого ожидания (без выполнения работы) в нём не происходит.

S>Не понял этот фрагмент -- почему синхронно и почему никакого ожидания не происходит (кого, в чем ?) ?
когда в .net мы вызываем запись в файл, то (в большинстве случаев) запись сначала происходит во внутренний буфер ОС и управление сразу возвращается вызывающей стороне.
ОС уже сама потом асинхронно флушит буфера на диск. В этом случае смысла запускать по сути синхронный метод в асинхронном варианте нет (кроме конечно хитрых кейсов, когда расклад будет не такой — данные не вошли в буфер, он переполнен и тп).
Re[7]: Async
От: Sharov Россия  
Дата: 25.08.21 08:54
Оценка:
Здравствуйте, MadHuman, Вы писали:

S>>Асинхронность одна и та же, просто механизмы разные -- отдельный поток или non-blocking io (через callback).

MH>я хотел сказать что разница в следующем — в 1-м случае работа запускается асинхронно и будет сделана позже и вызывающая
MH>сторона не ждет и никак не узнает что работа зафейлилась (что довольно редко в рассматриваемом кейсе).
MH>а во 2-м (то что в .net обычно подразумевают под асинхронностью, через калбэк) — вызывающая сторона асинхронно ожидает завершения работы
MH>и если что не так, то получит ошибку и может обработать.


Тут отличие, что в случае отдельного потока результат записи придется poll'ить из какой-то расшаренной структуры.
Узнать то узнает, но насколько данный процесс эффективен. Опять же, мы говорим о бд и транзакциях, насколько там
уместна вся эта асинхронщина (любым способом), я


MH>>>С учетом этого и потребность в .net асинхронности сомнительна при операциях записи, тк вызов по сути отрабатывает синхронно и никакого ожидания (без выполнения работы) в нём не происходит.

S>>Не понял этот фрагмент -- почему синхронно и почему никакого ожидания не происходит (кого, в чем ?) ?
MH>когда в .net мы вызываем запись в файл, то (в большинстве случаев) запись сначала происходит во внутренний буфер ОС и управление сразу возвращается вызывающей стороне.
MH>ОС уже сама потом асинхронно флушит буфера на диск. В этом случае смысла запускать по сути синхронный метод в асинхронном варианте нет (кроме конечно хитрых кейсов, когда расклад будет не такой — данные не вошли в буфер, он переполнен и тп).

Про это я в курсе, просто насколько всяческие кэши актуальны для бд и consisntency и durability. Т.е. бд нужны 100% гарантии, что
мы записали на диск, а не только в кэш ОС. Опять же, не в контексте бд, маленькие порции данных можно писать и синхронно,
а вот большие уже лучше асинхронно.
Кодом людям нужно помогать!
Re[8]: Async
От: MadHuman Россия  
Дата: 26.08.21 10:28
Оценка: 5 (1)
Здравствуйте, Sharov, Вы писали:


MH>>>>С учетом этого и потребность в .net асинхронности сомнительна при операциях записи, тк вызов по сути отрабатывает синхронно и никакого ожидания (без выполнения работы) в нём не происходит.

S>>>Не понял этот фрагмент -- почему синхронно и почему никакого ожидания не происходит (кого, в чем ?) ?
MH>>когда в .net мы вызываем запись в файл, то (в большинстве случаев) запись сначала происходит во внутренний буфер ОС и управление сразу возвращается вызывающей стороне.
MH>>ОС уже сама потом асинхронно флушит буфера на диск. В этом случае смысла запускать по сути синхронный метод в асинхронном варианте нет (кроме конечно хитрых кейсов, когда расклад будет не такой — данные не вошли в буфер, он переполнен и тп).

S>Про это я в курсе, просто насколько всяческие кэши актуальны для бд и consisntency и durability. Т.е. бд нужны 100% гарантии, что

S>мы записали на диск, а не только в кэш ОС.
не всегда. в той же sqlite это регулируется опцией, и как-токо включаем синхронный флуш на диск, производительность ожидаемо существенно падает.
там на самом деле ещё ряд кешей кроме ОС (у самого контроллера диска) и хз достижима ли полная синхронность.
и ослабление гарантии вполне ок, т.к. если питание не прервётся, то запись на диск всё равно практически гарантированно произойдет.
хотя даже если прервётся, есть свои меры — УПСы, конденсаторы и т.п.
Re[8]: Async
От: Sinclair Россия https://github.com/evilguest/
Дата: 26.08.21 13:24
Оценка: 23 (2)
Здравствуйте, Sharov, Вы писали:

S>Тут отличие, что в случае отдельного потока результат записи придется poll'ить из какой-то расшаренной структуры.

S>Узнать то узнает, но насколько данный процесс эффективен. Опять же, мы говорим о бд и транзакциях, насколько там
S>уместна вся эта асинхронщина (любым способом), я
Асинхронщина в БД вполне уместна. Если посмотреть в учебник, то более-менее передовым методом достижения Durability является Undo/Redo Log. (См. напр. https://www.cs.sjsu.edu/faculty/pollett/157b.12.05s/Lec20042005.pdf).
То есть изменения в сами данные можно сбрасывать на диск в любом порядке. Например, можно просто отмапить файл в память и дать ОС самой решить, что и когда записывать на диск.
А вот порядок записи в лог — важен; более того, если вас интересует durability, т.е. вы не хотите получить ситуацию, когда транзакция, подтверждение которой уже уехало клиенту, внезапно исчезает после рестарта, то нужно не просто запихивать записи в определённом порядке, но и (синхронно) дожидаться подтверждения окончания записи перед ответом клиенту.

S>Про это я в курсе, просто насколько всяческие кэши актуальны для бд и consisntency и durability. Т.е. бд нужны 100% гарантии, что

S>мы записали на диск, а не только в кэш ОС. Опять же, не в контексте бд, маленькие порции данных можно писать и синхронно,
S>а вот большие уже лучше асинхронно.
Тут сложный вопрос. Во-первых, диску удобнее работать большими блоками. Большинство современных дисков вообще не умеют записывать порции меньше, чем страница, т.е. от 4 до 16kb.
Многие умеют в один "приём" прожёвывать от 64kb и выше.
Поэтому, скажем, синхронно записать один мегабайт — это как бы норм, накладных расходов минимум. А вот если мы будем писать по 1kb, да ещё и с write-through, то это рискует затянуться надолго.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[9]: Async
От: Sinclair Россия https://github.com/evilguest/
Дата: 26.08.21 13:26
Оценка: +1
Здравствуйте, MadHuman, Вы писали:

MH>не всегда. в той же sqlite это регулируется опцией, и как-токо включаем синхронный флуш на диск, производительность ожидаемо существенно падает.

MH>там на самом деле ещё ряд кешей кроме ОС (у самого контроллера диска) и хз достижима ли полная синхронность.
MH>и ослабление гарантии вполне ок, т.к. если питание не прервётся, то запись на диск всё равно практически гарантированно произойдет.
MH>хотя даже если прервётся, есть свои меры — УПСы, конденсаторы и т.п.
Есть пропасть между "практически гарантированно" и "я не получу кашу в файле".
Самый замечательный УПС имеет свои ограничения, и если не проектировать протокол записи на диск так, чтобы он был устойчив к сбоям, то рано или поздно УПС таки выдохнется, и вот эта вот "последняя неудачная запись" запросто убъёт вам неограниченный объём данных.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[9]: Async
От: Sharov Россия  
Дата: 26.08.21 19:52
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>То есть изменения в сами данные можно сбрасывать на диск в любом порядке. Например, можно просто отмапить файл в память и дать ОС самой решить, что и когда записывать на диск.


Если речь об одной и той же строке данных в бд, то порядок важен.
Кодом людям нужно помогать!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.