On 8/24/15, Daniel Coles <daniel.coles at astadev.com> wrote:
> Hello,
>
> Our application is to use SQLite to store its data.  It uses a
> multi-threaded server, though in most cases SQLite would be accessed by one
> thread at a time.  The application runs on Microsoft Windows.
>
> Our initial SQLite implementation followed our interpretation of the
> guidelines laid out here
> (http://www.sqlite.org/cvstrac/wiki?p=MultiThreading), in that:
> * We use "multi-thread" mode
> * Threads create connections ('sqlite3' objects) to the database when
> needed, and then close them again once an operation is complete
> * The 'sqlite3' objects are not shared between threads
>
> Implementing encryption through the SQLite Encryption Extension (SEE) is
> causing me to question whether this is the correct strategy.  I would like
> to know:
> * Is there any sharing of information between the 'sqlite3' objects?  In
> particular, the in-memory unencrypted database page-caches; are those
> shared?

No, and no.  Unless you turn on shared-cache mode
(https://www.sqlite.org/sharedcache.html) and stop constantly closing
and reopening your database connections, then the answer would be Yes
and Yes.

> * What governs the lifetime of the page-caches?

The page cache is discarded for lots of reasons:  (1) you close the
database connection. (2) another process modifies the database file,
rendering the cache stale. (3) You invoke PRAGMA shrink_memory.  Etc.


> * We do not want multiple application instances to modify the same file at
> once.

SQLite automatically serializes writes.  You do not have to do
anything to make this happen.

> * What happens if an application unexpectedly exits while having a SQLite
> file exclusively locked?  Is the lock automatically released by the
> underlying OS?

Yes.  And any uncommitted changes are rolled back.

>
> My current suspicion is that I will need to change our SQLite threading so
> that we have one persistent 'sqlite3' connection that is shared between
> threads.  Does that sound advisable?
>

That depends on so many things that it is hard to say.  You could
certainly try it and see how it works out!  But I think if you just
avoid constantly opening and closing connections, things will go
better.
-- 
D. Richard Hipp
drh at sqlite.org

Reply via email to