我们有一个跨三个应用程序使用的对象模型。两个程序收集数据,另一个读取数据并生成报告。系统是非常不连接的,所以我们不能有一个所有程序都能与之对话的数据库。
现在,这些程序只是使用一个公用库来填充对象模型并序列化/反序列化到磁盘。具体地说,我们使用XML序列化。
这个模型有几个问题。1) XML可能被认为是浪费的。这些文件可能会变得大而笨拙。老实说,文件大小目前并不是一个大问题。2)我最关心的是内存占用。整个文件被加载到对象模型中,对其进行操作,然后保存。
希望我已经表达了我的担忧,在运行时我们会遇到这个应用程序的内存问题。足够的数据将被收集到一个单独的“数据库”(xml文件)中,以至于它不能同时加载到内存中。
我想要的是通过文件存储而不是内存来访问我的对象模型。我希望对对象模型的更改最小。当一个对象被访问时,它来自磁盘,当它被设置时,它被保存(如果可能的话,自动保存)。
我们已经研究了NHibernate与SQLite,SQL Compact4.0和EF4,以及LINQ to XML (简要地)。我过去也曾使用db4o将对象缓存到磁盘,但这是一个无关的项目。
在我投入时间学习其中一个之前,我想知道我的想法是否有意义。我可以有一个对象模型,它可以“神奇地”缓存到存储介质中,而不是无限地膨胀我的内存占用吗?完成这项工作的最短路径是什么,即使它不是最优雅的?
有没有其他技术可以帮助我?内存映射文件,linq-to-sql,Lazy(T) (仅用于在可能需要时从文件中获取对象)。
我意识到这是一个开放式的问题。我正在寻找一个大的图片响应和细节,如果有人在现实世界中这样做的经验。链接会很有帮助...
谢谢。
发布于 2011-03-03 16:31:17
出于同样的考虑,我刚刚完成了将一个由XML文件支持的(主要是“继承的”) web应用程序迁移到NHibernate。我也处于同样的情况,以前从未使用过NHibernate,并想在这个过程中学习。这个想法确实有道理。您将确实能够在内存中加载您实际需要的部分(而不是整个DB),并获得更多好处。
根据您要求的其他条件(对对象模型的最小更改,易于从实际应用程序迁移到基于ORM的应用程序),我不确定您是否能如此轻松地获得它们。对于像NHibernate和EF4这样的ORM,模型类是非常轻量级的:它们基本上就是属性容器。基于XML文件的应用程序往往在模型中直接具有更多的逻辑:您可能必须将该逻辑移到数据访问层。重新设计模型和数据访问层可能是您面临的最耗时的任务。我知道这是给我的。
我从您的问题中推断出的另一件事(您说不能让所有三个程序都与同一个数据库对话,并且您提到了SQLite和SQL Compact)是通过物理地复制文件在三个应用程序之间复制数据。您如何检测更改以及如何对齐这3个DB?您目前如何合并更改(在3个应用程序中有2个可以写入数据的情况下)?这取决于您复制数据的方式,ORM可能对您有所帮助,也可能不会对您有所帮助。
根据您的评论编辑更多要点
https://stackoverflow.com/questions/5177935
复制相似问题