首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >跨AppDomain边界的内存数据库

跨AppDomain边界的内存数据库
EN

Stack Overflow用户
提问于 2009-09-03 06:57:23
回答 2查看 617关注 0票数 2

我想知道是否有一个内存中的数据库实现,其中相同的内存中的数据库实例可以跨多个AppDomains使用。

的动机.和很多人一样,我们为我们的客户机-服务器应用程序进行了集成测试。有几种测试模式,从最沉重的测试模式--现实场景,客户端、服务器和数据库都位于不同的机器上,到最轻量级的测试模式,客户机和服务器都是同一进程中的两个AppDomains,数据库是同一台机器上的一个sqlite文件。

当然,轻量级场景是最快的,开发人员经常使用它,而重型场景则在每次构建时在我们的CI服务器上运行。

我的目标是通过使用内存中的数据库进一步加快轻量级场景的速度。

问题。 OK,所以sqlite有一个内存中的数据库选项,但是这样的数据库:

  • 在关闭与其的连接后释放。
  • 不能有两个打开的连接,新连接将打开另一个数据库实例。

不幸的是,我需要两个--一个用于运行在客户端AppDomain中的测试暂存代码,另一个用于服务器端DAL。

我意识到了sqlite数据库工作方式背后的原理。我还意识到在两个AppDomains之间共享内存数据库的困难.如何在不恢复到内存映射文件的情况下共享两个AppDomains之间的内存缓冲区(我不想处理任何文件系统API)?

我看到的唯一有效的解决方案是让两个AppDomains共享一个非托管内存缓冲区,其中对缓冲区的句柄将从一个AppDomain传递到另一个AppDomain。但是,是否有任何内存中的数据库实现支持此设置?

(一个效率低下的解决方案是将整个数据库从一个AppDomain传递到另一个数据库,然后再返回)。

我的分析可能是完全错误的,可能有一些简单的解决办法我错过了。无论如何,我想知道是否有人遇到过同样的问题,以及他们是如何解决的。

P.S.

我真的想避免任何类型的files,比如内存映射文件。

EN

回答 2

Stack Overflow用户

发布于 2009-09-03 07:18:03

我想到了三个解决方案,但它们都需要一些配置。它们都要求您创建第三个AppDomain,其中内存中的数据库作为一个单例驻留在其中,并为一个具有定义良好接口的类编写代码。

第一个解决方案是通过AppDomains调用代码。您传递的对象必须是“可重构的”,这可能是一个很重要的设置。(派生自MarshalByRefObject等)不仅如此,您传递给或从AppDomains传递的任何对象都必须是可序列化的。它是可行的,但有时它并不漂亮。

第二个解决方案是使用远程处理。这是一种古老的技术,但仍然有效。它基本上是通过AppDomains对上面的调用进行形式化化。我不会再在这里说这件事了,提起这件事几乎让我感到尴尬。

第三种解决方案是使用WCF和快速的namedPipeBinding。WCF调用的两端可以位于相同的应用程序和不同的应用程序域中。用这种方式编写代码的一个副作用是,您可以在稍后切换内存中的数据库,以便功能齐全的数据库,并将绑定更改为跨intranet或internet工作。

第三种解决方案是我目前使用的类似于您描述的项目的解决方案。我们的目标是隔离数据库,这样我们就可以在不“污染”其他层的情况下尝试nHibernate。

票数 1
EN

Stack Overflow用户

发布于 2009-09-03 07:15:08

我不知道任何这样的数据库。

但是想一想这样的数据库会有什么样的形式是很有趣的。如果我们认为一个应用程序域是一个轻量级的过程,那么我们可以将跨域会话(序列化)视为消息传递。然后,我们可以定义一个简单的消息协议,允许客户端发送查询,并响应获取结果。

  1. 您的数据库应该在自己的应用程序域中运行。
  2. 每个客户端都应该在自己的应用程序域中运行。
  3. 应该使用app域之间的标准序列化来返回查询结果。最简单的方法是将查询封装在它们自己的类中,这些类在构造时执行。这样,您可以使用AppDomain.CreateInstance
  4. 您的数据库应该能够处理来自任何线程的请求。

但我不认为这是个好主意。在应用程序域的工作和互操作中有太多的细节来实现这个100%的正确。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1371792

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档