(no title)
darthShadow | 1 year ago
https://github.com/TryGhost/node-sqlite3/issues/408#issue-57...
https://github.com/WiseLibs/better-sqlite3/issues/32#issueco...
Copying a quote from the second:
> The sqlite3 C API serializes all operations (even reads) within a single process. You can parallelize reads to the database but only by having multiple processes, in which case one process being blocked doesn't affect the other processes anyways. In other words, because sqlite3 serializes everything, doing things asynchronously won't speed up database access within a process. It would only free up time for your app to do other things (like HTTP requests to other servers). Unfortunately, the overhead imposed on sqlite3 to serialize asynchronous operations is quite high, making it disadvantageous 95% of the time.
ncruces|1 year ago
The way threading and concurrency work in SQLite may not mesh well with NodeJS's concurrency model. I dunno, I'm not an NodeJS/libuv expert.
But at the C API level that statement is just wrong. Normally you cannot share a single connection across threads. If you compile SQLite to allow this, yes, it'll serialize operations using locks. The solution is to create additional database connections, not (necessarily) launch another process. With multiple database connections, you can have concurrency, with or without threads.
https://sqlite.org/threadsafe.html
Again, whether this is viable in NodeJS, I have no idea. But it's a Node issue, not a C API issue.
BTW, we're commenting on a Ruby article, and SQLite in Ruby has seen "recent" advances that increase concurrency through implementing SQLite's BUSY handler in Ruby, which allows the GVL lock to be released, and other Ruby and SQLite code to run while waiting on a BUSY connection.
https://fractaledmind.github.io/2023/12/11/sqlite-on-rails-i...
julik|1 year ago
SCLeo|1 year ago
tobyhinloopen|1 year ago
Maybe you can even create your own async wrapper that delegates any query to a separate process.
tobyhinloopen|1 year ago