在.net的内存数据库中[关闭]

Posted

技术标签:

【中文标题】在.net的内存数据库中[关闭]【英文标题】:In memory database in .net [closed] 【发布时间】:2011-07-11 01:17:32 【问题描述】:

我有一个 .net 应用程序,我想在其中使用 In-Memory 数据结构。请告诉我它与物理数据库相比如何工作。

【问题讨论】:

您需要在此处进一步阐明您的实际目标。 听起来你在考虑数据集:msdn.microsoft.com/en-us/library/ss7fbaez.aspx 【参考方案1】:

内存中数据库 (IMDB) 是一种驻留在内存中的关系数据库,它通过在主内存中存储和操作数据来消除磁盘访问。 IMDB 通常具有严格的基于内存的架构和直接的数据操作。

有点相关的东西:

Good in-memory database for .net/PowerShell? SQLite in-memory database backup in .NET Alternative to the TimesTen in memory database in .NET

【讨论】:

缩写IMDB 可能是正确的,但毫无用处。随着谷歌迅速产生指向电影评级网站的网址。不过没有冒犯。【参考方案2】:

在描述内存数据库时,有两个误区需要纠正。

1) “内存数据库的持久性不如磁盘数据库”。虽然这对于更简单的内存数据库来说是正确的,但企业级内存数据库在提交事务时会将数据保护到磁盘。磁盘仅在磁盘臂移动时才变慢。如果您考虑一下,您可以在几秒钟内在快速磁盘上写入一个千兆字节。如果您的数据库发生如此大的变化,您每天可以实时保护 TB 级数据。这使得 ram 数据库(如 HANA 和 Starcounter)与磁盘数据库一样安全,同时速度超快。您可以随时关闭电源,检查点和恢复的工作方式与基于磁盘的数据库相同。

2) “内存数据库要快得多。”内存数据库更快的原因仅仅是因为它们在内存中运行。如果您将传统数据库放在 RAM 驱动器上,则不会发生任何事情。事实上,由于这些天的缓存通常超过您的数据库大小,它们已经驻留在内存中。内存数据库如此高效的原因是数据库映像被视为主内存而不是辅助内存。这意味着现代 RAM 数据库在读取数据时不会将页面从磁盘映像复制到 RAM。在现代服务器中,memory wall 很快成为瓶颈。在 RAM 数据库中可以避免这种情况。第二个原因是,当您为比磁盘快数千倍的介质开发东西时,您往往不会以微秒和毫秒为单位增加开销,因为消耗纳秒的东西会立即可见。在磁盘规模上,没有理由在这个级别优化代码。当 RAM 价格突然下降(自 2000 年以来下降了 98%)时,您不能只重写整个数据库引擎。

【讨论】:

除了 2) 相比说 Sql server Express,您没有显着的 IPC 成本、对 sql 格式的序列化和 SQL 查询解释。【参考方案3】:

内存数据库与普通数据库一样工作,但内容存储在内存中而不是磁盘上。这会在应用程序关闭时丢失所有数据。它们必须在每次启动时重建并填充数据。

可以在内存模式下运行的数据库示例是SQLite。请注意,SQLite 是一个进程中的数据库,您将其托管在您的应用程序中。

【讨论】:

【参考方案4】:

您可以使用MemCached,它是一个分布式内存对象缓存系统。 Memcached 是一种内存键值存储,用于存储来自数据库调用、API 调用或页面渲染结果的任意数据(字符串、对象)的小块。

使用 memcached,您可以看到所有服务器都在查看同一个虚拟内存池。这意味着给定的项目总是被存储并且总是从整个网络集群中的相同位置检索。

【讨论】:

【参考方案5】:

这是访问in-memory database using Data Provider for .NET 的教程。您可以将 SQL 语句用于预测分析、地理空间、文本分析和模糊搜索。您可以免费下载此数据库(HANA,速成版)并在具有超过 8GB RAM 的计算机中的虚拟机中使用它,或者将其安装到 MS Azure 中的 VM 中。

【讨论】:

以上是关于在.net的内存数据库中[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

。NET中诊断内存泄漏的工具(ASP.NET应用程序)[关闭]

从内存而不是磁盘加载.NET程序集[关闭]

java用哪个数据库在内存中存储数据? [关闭]

最好的 .NET 内存和性能分析器? [关闭]

内存数据库的用例是啥? [关闭]

内存中的 Java DB [关闭]