是否有任何支持多线程的本地数据库?

Posted

技术标签:

【中文标题】是否有任何支持多线程的本地数据库?【英文标题】:Are there any local DB that support multi-threading? 【发布时间】:2009-03-31 09:09:17 【问题描述】:

我试过 sqlite, 通过使用多线程,只有一个线程可以同时更新数据库.. 我需要多线程同时更新数据库。 是否有任何数据库可以完成这项工作?

ps:我用的是delphi6。


发现sqlite可以支持多线程,

但是在我对asgsqlite的测试中,当一个线程插入时,其他线程会插入失败。

我还在测试中。

【问题讨论】:

【参考方案1】:

SQLite 可用于多线程环境。

查看this link

【讨论】:

【参考方案2】:

Firebird可以在嵌入式版本中使用,但是在本地使用标准(服务器)安装也没有问题。非常小,易于部署,并发访问。与 Delphi 配合得很好,您应该将其作为一个选项进行研究。

另请参阅 *** 问题"Which embedded database to use in a Delphi application?"

【讨论】:

【参考方案3】:

Sqlite 在更新时会锁定整个数据库(除非自从我上次使用它以来这已经改变了)。第二个线程不能同时更新数据库(即使使用完全独立的表)。但是有一个超时参数告诉第二个线程在失败前重试 x 毫秒。我认为 ASqlite 在数据库组件中显示了这个参数(我想我实际上写了那段代码,全部 3 行,但那是几年前的事了)。

将超时设置为大于 0 的值将允许多个线程更新数据库。但是可能会对性能产生影响。

【讨论】:

【参考方案4】:

从 3.3.1 版开始,SQLite 的线程要求一直是greatly relaxed。在大多数情况下,这意味着它simply works。如果你真的需要更多的并发性,使用数据库服务器可能会更好。

【讨论】:

【参考方案5】:

SQL Server 2008 Express 支持并发以及 SQL Server 的大多数其他功能。而且是免费的。

【讨论】:

AFAIK 它只会为所有 SPID 使用一个 CPU,但它会很高兴地支持并发 SPID...【参考方案6】:

为什么需要多个线程同时更新?我确信 sqlite 将确保更新正确完成,即使这意味着一个线程等待另一个线程完成;这对应用程序是透明的。

确实,同时更新多个线程很可能对性能没有好处。也就是说,看起来可能有多个线程同时更新,但实际上结果是更新完成的速度比没有更新的慢(因为它们需要持有许多页面锁等以避免出现问题) .

【讨论】:

假设所有线程都在更新相同的记录或至少相同的表。即便如此,还有其他允许快速多线程更新的数据库引擎,例如 Firebird。 我使用多线程来区分操作,比如一个线程读取数据,一个线程处理数据。【参考方案7】:

来自 ElevateSoft 的 DBISAM 在多线程模式下工作得非常好,并且具有自动会话命名功能,使这变得容易。请务必遵循帮助中的页面,了解如何确保一切安全并完成工作。

【讨论】:

【参考方案8】:

实际上,我目前正在使用 Sybase ASE 上的多线程 Java 进程进行性能测试。该进程解析一个 1GB 的文件并插入到一个表中。

一开始我很害怕,因为许多高级程序员警告我“表锁定”以及并发访问数据库是多么危险。但是我继续进行了测试(因为我想自己找出答案)。

我创建了一个单线程进程并将其与使用 4 个线程的进程进行了比较。我的总执行时间只减少了 20%。我使用不同的线程数和批量插入大小重试了该过程。我能挤出的最大值是 20%。

我们将很快切换到 Oracle,因此我将分享 Oracle 在发生这种情况时如何处理并发插入。

【讨论】:

以上是关于是否有任何支持多线程的本地数据库?的主要内容,如果未能解决你的问题,请参考以下文章

任何 .NET ORM 是不是支持开箱即用的本地化实体?

java定时任务使用多线程webservcie执行了两次这是为啥?

是否有任何本地 GraphQL 数据库用于 react-native?

访问 linux 线程的本地堆栈(pthreads)

如何在 nodejs 中调试或运行本地 GCP 无服务器应用程序?

企业库缓存到本地数据库