内存通信与DBMS



是否有与外部IDE或C语言等数据库管理系统中的TVF/UDF通信的选项?在不写入表的情况下进行操作?

我知道有一种"内存映射"的方法或者一种共享内存块的方法

POSIX mmap()函数Windows OpenFileMapping() function

我正在使用Windows,所以有一种方法来通信DBMS使用内存映射或与像C一样的东西共享?但是如何避免只使用内存写入表或文件呢?

共享内存可用作与SQL提供程序之间的数据传输。如果您使用内置驱动程序访问您的提供商,则不必为此编写任何额外的代码。相反,您只需配置驱动程序和服务器来使用它,并且您的应用程序必须与SQL提供程序驻留在同一台服务器上。

windows可用的ODBC驱动程序支持SQL活动的共享内存。要用C编写这些代码,您需要使用ODBC API与您的提供者进行通信。这是一个带有函数引用的链接。

ODBC功能摘要@ MSDN

还要注意,对于所有可以处理任意二进制数据的SQL提供程序都支持blob。这里提供了ODBC API已知的类型列表。没有严格要求语句结果必须以表格形式表示。

SQL数据类型@ MSDN

另一方面,如果你关心的是用你自己的术语与内部SQL实体通信,你可以通过扩展到你正在使用的SQL服务来修补一些东西。例如,MS SQL Server允许通过Ole Automation Procedures或CLR (.net) Integration(在MS SQL Server中可用)进行扩展。你可能会用这些来做带外通信。然而,这两种方法都不容易用纯C解决方案创建。

SQL Server @ MSDN中的Ole自动化程序

CLR在SQL Server @ MSDN中的集成

但是,我建议您避免这样做,因为您将发现您受到主机服务环境的支配,并且您可能无法参与事务。

如果你的数据集的大小要求是如此之大,你认为RAM和直接访问是最好的选择,你的需求可能会更好地满足通信数据集中的变化部分保存在SQL之外。此外,由于共享内存解决方案仅限于一台机器,您可能需要考虑将数据集上的工作分散到多台机器上。通过这种方式,您更有可能看到性能/生产力的提高,而不是改变SQL中引用数据的方式。

最后,很难命令SQL提供者避免使用文件系统存储。对于MS SQL Server,一个可能的选择是强制tempdb驻留在RAM中。这里有一篇KB文章提供更多细节。其他dbms可能有类似的配置选项。

INF:何时在RAM中使用tempdb

然而,磁盘存储的使用并不一定是引起关注的原因。我找不到SQL提供者如何管理RAM/文件系统平衡的好例子,但是SQL服务器的一个很好的类比是页面文件使用如何影响windows。这里有一个很好的链接,详细介绍了windows在高操作限制下的行为,以及内存使用如何不一定对应于溢出到磁盘使用。还要注意,当主机的操作达到这些限制时,为在windows上运行而编写的应用程序也会受到不利影响。

推动Windows的极限:虚拟内存@ TechNet

DBMS必须设计成您想要的工作方式。常规DBMS有自己的数据管理机制,虽然您可能能够通过共享内存与它们通信,但更有可能的情况是,您不能这样做。DBMS可能将其大部分工作数据保存在内存中;这取决于DBMS。通常,数据将由磁盘存储进行备份。

你不能做的是选择一个任意的DBMS,并命令它通过共享内存与你的进程通信。如果它被设计成这样,那么你可以;否则,你不能。

但是,通常情况下,您使用ODBC或类似的驱动程序从应用程序访问DBMS,实现驱动程序(和DBMS)的人决定进程间通信将如何发生。

最新更新