System.Data.SQLite内存数据库多线程

6

我正在创建一个System.Data.SQLite的内存数据库,使用的连接字符串为:

"Data Source=:memory:", 

我希望能够在多线程中访问此数据库。

现在我所做的是克隆SQLiteConnection对象并将副本传递给工作线程。

但我发现不同的线程实际上获得了独立的内存数据库实例,而不是共享的数据库。如何在多个线程之间共享一个内存数据库呢?

谢谢!


1
可能有一种正确的方法来解决这个问题,但如果你赶时间,你可以尝试使用内存映射文件——这是一个鲜为人知的功能,但本质上,.NET允许您创建一个虚拟文件,它只是指向内存中的某个区域;然后任何试图访问该文件的东西[包括外部应用程序等]实际上只会针对内存进行操作。——不过,我不知道SQLite是否喜欢多个线程同时访问同一个文件,它们可能会互相干扰并损坏文件。 - BrainSlugs83
1个回答

6

根据SQLite关于内存数据库的文档,建议尝试使用以URI文件名约定命名的数据源,例如file::memory:?cache=shared来代替:memory:,并注意指定连接使用的缓存名称。正如页面所解释的那样,每个:memory:实例彼此独立,就像你发现的一样。

请注意,在连接到内存数据库之前,您可能还需要首先启用共享缓存模式(在共享缓存文档中指定),使用sqlite3_enable_shared_cache(int)进行调用才能使其工作。


你知道我怎么在H2中做同样的事吗? - Daniil Shevelev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接