我想知道是否有一个内存中的数据库实现,其中相同的内存中的数据库实例可以跨多个AppDomains使用。
的动机.和很多人一样,我们为我们的客户机-服务器应用程序进行了集成测试。有几种测试模式,从最沉重的测试模式--现实场景,客户端、服务器和数据库都位于不同的机器上,到最轻量级的测试模式,客户机和服务器都是同一进程中的两个AppDomains,数据库是同一台机器上的一个sqlite文件。
当然,轻量级场景是最快的,开发人员经常使用它,而重型场景则在每次构建时在我们的CI服务器上运行。
我的目标是通过使用内存中的数据库进一步加快轻量级场景的速度。
问题。 OK,所以sqlite有一个内存中的数据库选项,但是这样的数据库:
不幸的是,我需要两个--一个用于运行在客户端AppDomain中的测试暂存代码,另一个用于服务器端DAL。
我意识到了sqlite数据库工作方式背后的原理。我还意识到在两个AppDomains之间共享内存数据库的困难.如何在不恢复到内存映射文件的情况下共享两个AppDomains之间的内存缓冲区(我不想处理任何文件系统API)?
我看到的唯一有效的解决方案是让两个AppDomains共享一个非托管内存缓冲区,其中对缓冲区的句柄将从一个AppDomain传递到另一个AppDomain。但是,是否有任何内存中的数据库实现支持此设置?
(一个效率低下的解决方案是将整个数据库从一个AppDomain传递到另一个数据库,然后再返回)。
我的分析可能是完全错误的,可能有一些简单的解决办法我错过了。无论如何,我想知道是否有人遇到过同样的问题,以及他们是如何解决的。
P.S.
我真的想避免任何类型的files,比如内存映射文件。
发布于 2009-09-02 23:18:03
我想到了三个解决方案,但它们都需要一些配置。它们都要求您创建第三个AppDomain,其中内存中的数据库作为一个单例驻留在其中,并为一个具有定义良好接口的类编写代码。
第一个解决方案是通过AppDomains调用代码。您传递的对象必须是“可重构的”,这可能是一个很重要的设置。(派生自MarshalByRefObject等)不仅如此,您传递给或从AppDomains传递的任何对象都必须是可序列化的。它是可行的,但有时它并不漂亮。
第二个解决方案是使用远程处理。这是一种古老的技术,但仍然有效。它基本上是通过AppDomains对上面的调用进行形式化化。我不会再在这里说这件事了,提起这件事几乎让我感到尴尬。
第三种解决方案是使用WCF和快速的namedPipeBinding。WCF调用的两端可以位于相同的应用程序和不同的应用程序域中。用这种方式编写代码的一个副作用是,您可以在稍后切换内存中的数据库,以便功能齐全的数据库,并将绑定更改为跨intranet或internet工作。
第三种解决方案是我目前使用的类似于您描述的项目的解决方案。我们的目标是隔离数据库,这样我们就可以在不“污染”其他层的情况下尝试nHibernate。
发布于 2009-09-02 23:15:08
我不知道任何这样的数据库。
但是想一想这样的数据库会有什么样的形式是很有趣的。如果我们认为一个应用程序域是一个轻量级的过程,那么我们可以将跨域会话(序列化)视为消息传递。然后,我们可以定义一个简单的消息协议,允许客户端发送查询,并响应获取结果。
但我不认为这是个好主意。在应用程序域的工作和互操作中有太多的细节来实现这个100%的正确。
https://stackoverflow.com/questions/1371792
复制