关于ORM和内存数据库的遐想

最近有消息说韩国电信已经在新的3G 的BSS系统中开始使用内存数据库,而且还是基于对象的内存数据库,这个消息对于一直在做电信系统开发的我来说很是让我浮想联翩,很早前就想对一些老系统用ORM做一次重构了,但是因为种种原因和ORM的种种局限而未能最终走出这一步,对象化内存数据库的实用化让我看到了希望的曙光。
其实也不能说电信系统里就没有使用ORM的例子,其实很多系统已经在使用Hibernate了,不过很可惜的是,在很大一段时间内国内做.NET开发的人们都是处于邯郸学步的状态,JAVA里有了个Hibernate,于是有了NHibernate。拿来主义固然好,但是再好的框架也有遇到中国国情的时候(微软和中国果然很有缘份)。很多时候做.NET的人都有点对java有说不出的感觉,总觉得自己先进,但是每每看到用java的大型系统(特别是电信领域)的时候,总是存在很复杂的表情。可能是叫自惭形秽,因为我也是学.NET出身,又是在电信行业的环境内,所以感觉特别强烈,不过也不用妄自菲薄,电信里面也是有.NET一席之地的。
这里回到问题本身,为什么不用ORM?这里已开始我主要考虑的就是效率问题。现在的ORM框架基本原理无外乎都是通过万能的反射来实现映射的目的。不过众所周知的,反射就意味着百倍的性能下降(关于反射的效率问题网上文章多多,不再累述,前段时间和徐晓卓谈到这个问题的时候也是这个结论),还有一点就是成倍的增加了Call stack的长度,这个也是不小的开销。总之在这个时候,强调实时性的电信系统也别是VNET的计费系统在使用的时候不得不面对这个严峻的问题。第二点也是很多人想反驳我的观点的地方,很多ORM框架,比如NHibernate,iBaties.NET等都有缓存机制,也有的有LazyLoading,何来效率问题?这里强调一下,这两个框架的源码我没看完过,用法也不精通,所以说错了希望有大大出来纠正我,根据我现有有限的智慧发现,LazyLoading的效率问题依然严峻,因为就算是延迟了加载,但是总归是会加载的,当一个类的成员列表的长度达到几十万,或者上百万的级别的时候,你会发现,貌似一开始就加载和调用时加载没什么区别,而且就我有限的智慧发现这样子调用是无法对子列表进行分页处理的。老一辈无产阶级革命的程序员教导我们,读取大列表一定要分页,这里我们不得不违背了这个原则,但是就算是有缓存也不是万能膏药,举个实际的例子,一个大数据库的用户表数据量高达100W数量级,包括各类用户等等,100W的数据要占用1个多G的空间。这个时候我只能傻眼了(iBaties.NET对查询作缓存,空间浪费更加严重),一般的WEB服务器上只有2G的内存。
虽然说这是个硬件贬值比工资贬值都快的年代,但是在WEB Server用Cache未免开销过大,大型系统最小部署就需要4台PCServer做群集。同时升级4台Server的内存是用户所不能接受的。
这时候该我的救星,内存数据库粉墨登场拉,不过现在还只是在我的想象之中,最终的效果可能暂时还不会真正的使用
在我的设想中最终存储数据的还是物理磁盘作为最终的载体,不过所有的业务数据都由内存数据库Cache起来,对于用户的输入能够最快的作出反应,并且通过刷新机制,根据策略把数据永久性的写入磁盘,在这里比如用户数据,订购元数据,当月订购关系,当月详单全部load进内存,所有业务都在内存中展开,账期结束的时候再写入物理磁盘永久保存,如果中途掉电通还可以通过日志和物理磁盘里上次提交结果来恢复。这样子把这个内存数据库部署在两台接口机上,配制成群集,这个时候就只需要升级两台Server的内存就能满足目标了。

posted on 2007-01-23 13:21 亚历山大同志 阅读(14458) 评论(24)  编辑 收藏 所属分类: ORM

评论

#1楼  2007-01-23 13:26 cnlamar      

即便没有内存数据库仍旧可以有很好的cache方案。   回复  引用  查看    

#2楼  2007-01-23 13:30 橙橘冰风 [未注册用户]

学习   回复  引用    

#3楼  2007-01-23 13:31 九天 [未注册用户]

顶   回复  引用    

#4楼  2007-01-23 13:45 dhbbs [未注册用户]

已阅   回复  引用    

#5楼  2007-01-23 13:45 小陆      

内存数据库的优势必须在对象数据库的基础上才能显示出来。既然数据已经cache到内存中,再搞成关系型数据就纯属浪费了。把内存里的数据转化成内存里的对象,还不如直接存进去就是一个对象。
其实目前很多数据库,如果配置的好的话,查询的缓存命中率可以达到95%以上,大部分数据已经是cache了。之所以效率仍然不够好,是因为很多资源浪费在形式的转化上了。我们有多少代码是在干这样的事:把关系型数据解释成程序需要的对象、结构体,小心翼翼的维护关系的完整性。   回复  引用  查看    

#6楼 [楼主] 2007-01-23 13:56 亚历山大同志      

纯粹的对象在某些时候还是有局限性,或者是我的OO功力还不够,但是窃以为适当Mapping还是有必要的,毕竟纯粹OO的复杂检索和汇总计算的便捷程度上和效率上都还有待考证,且过渡的设计未免太过激进,可能沾染了电信的死气沉沉,我的思维似乎总是有点老派,可能跟不上时代咯   回复  引用  查看    

#7楼 [楼主] 2007-01-23 13:57 亚历山大同志      

这里还有个约束就是在SqlServer为前提,因为Oracle众所周知就是内存大户和cache王子了   回复  引用  查看    

#8楼  2007-01-23 14:25 woodhead      

lazyloading是不用就不loading,假设你需要用列表列出100个对象,然后点击列表项后察看对象和子对象的详细信息,那么只要你在列表中没有显示LazyLoading的子对象的数据,那么在列表时就不会load子对象,只有在点击察看详细信息后才会load子对象.所以有99个对象的子对象是始终不会被load的.
只要设计能力足够, ORM在效率上可以很贴近直接使用SQL的方式.再加上经过正确的面向对象设计的系统调优难度要比传统的系统低,所以在应付需求变化剧烈的系统的角度而言,面向对象设计+ORM更加容易使系统达到可以交付的工作效率.
当然,所有这一切都有个前提:系统必须有足够优良的设计.
  回复  引用  查看    

#9楼 [楼主] 2007-01-23 14:41 亚历山大同志      

to woodhead 同志
你考虑到了列表100个对象 1-1的情况,如果得到A的实例,要取得A的子对象列表,这个列表有200W条数据的时候,又如何?   回复  引用  查看    

#10楼  2007-01-23 15:11 woodhead      

to 亚历山大同志:
如果是1-200W这样的情况, 就不会是通过ORM自动映射来解决这个问题了.绝对的教条式ORM可不是我的主张. 打个比方,老兄是做电信的,电信、银行这类行业的流水数据格式常常就违反了三范式,但你也不能说你用的不是关系型数据库。
拿交易流水数据和交易用户为例:
交易流水=>交易用户可以配置为ORM自动LazyLoading,而交易用户=>交易流水就不该配置这样的关系。我见过的ORM工具都提供了单项和双向的关联关系自由配置。
  回复  引用  查看    

#11楼 [楼主] 2007-01-23 15:34 亚历山大同志      

to woodhead
从完美的主张来说,打破了类之间的导航关系,始终不是优雅的实现,这样子的lazyload聊胜于无,从架构设计上来说是失败的,但是实际上又方法能够解决倒是不假,相信设计框架的不会是傻瓜的,任何实际的方案里都有解决之道,不过偶有点偏执的完美主义倾向,北方俗称较真   回复  引用  查看    

#12楼  2007-01-23 15:43 赵宝民 [未注册用户]

根据我4年前k的结果 对ORM和内存数据库的结论是这样的
要么自己写一个外挂解释器的链表,要么自己用C挥着il码写一个inmemoryDB剩下来方法没了 最好的berkelydb也被收购了是在没办法了
我现在的办法是使用基于关系型数据库的链表   回复  引用    

#13楼  2007-01-23 15:59 woodhead      

to 亚历山大同志:
呵呵,有完美主义倾向没什么不好,最少你知道你是在什么地方做了妥协的。由于硬件的限制,妥协总是免不了的。ORM是这样,以前园子里讨论的贫血模型也是这样。 如果有一天,计算机系统强大到一台机器的CPU+内存就能满足一个系统的所有要求,那么我们也就能够完美地优雅了。   回复  引用  查看    

#14楼  2007-01-24 09:14 oswica@gmail.com [未注册用户]

只能是遐想罢了。。。
vnet不是想改就改的了的。。。
  回复  引用    

#15楼  2007-01-24 12:27 henry      

楼主你不能把所有问题都集中有数据量上!
虽然数据有这么多,但实际符合现实需求需要的远远达不到这个数.
不要说10W条即是1W条在IE中输,客户看到都会后悔!
不论是ORM组件还是直接Ado.net按需加载才是正道.

对NHibernate在使用上的确发现在某些处理上占用连接时间太长,导致连接池产生压力影响程序,但这也许我个使用不正确导致的.
  回复  引用  查看    

#16楼 [楼主] 2007-01-24 14:55 亚历山大同志      

@henry
建议你多看看一些大型解决方案特别是部署在N台服务器上的大型分布式系统的设计   回复  引用  查看    

#17楼  2007-01-25 23:06 枭魂 [未注册用户]

ORM肯定未来发展的趋势,提供更清晰更高效的语言和方法是高手们一直都在不断探索的。至于ORM当前是否有一席之地那是仁者见仁。

只要内存够大,CPU有足够的寻址范围(128bit或者更高)再多的数据都能放到内存里。是不是需要使用内存数据库可由硬件环境决定。 :D   回复  引用    

#18楼  2007-01-26 11:07 冬冬      

我有个问题,如果采用内存数据库?怎么分布式?如果一台服务储存数据,其他服务器(Web)从数据服务器提取数据,那样性能会提高很多吗?数据在服务器之间的传输怎么样?串行化一系列的对象?   回复  引用  查看    

#19楼  2007-02-01 23:34 赵宝民 [未注册用户]

@冬冬
http://www.garret.ru/~knizhnik/news.html
这个哥们的数据库回答了你全部的问题 哈哈 他写了好几个数据库系统 完全完成了你说的那些内容
我都下载实验过的 很是不错
可惜他的perst被收购了 我就不用了
他人挺好的 你问他问题他回答的特别快   回复  引用    

#20楼  2007-04-02 15:36 域名注册 [未注册用户]

好   回复  引用    

#21楼  2007-07-16 16:30 嘻嘻 [未注册用户]

韩国有个内存数据库 在 深圳高新技术展展出的了。湖南电信买了的
我估计不怎么好 。东西都在内存 万一死了 那不就 爽歪歪了。   回复  引用    

#22楼  2007-07-18 09:19 acheqi [未注册用户]

内存数据库,很好的想法,不过这东西实施起来有一定的难度   回复  引用    

#23楼  2007-07-24 16:33 土星的狗狗      

我感觉还有可行的,只是在部署的时候麻烦一些,但只要系统内部写的严谨,对一些突发事件考虑的很细致,效率上可以提高不少,还是值得去用的,但大家是否考虑在很多数据并发的时候怎么处理?还不是要频繁的去读取?还不如直接。。。把硬盘全换成闪盘,呵呵!   回复  引用  查看    

#24楼  2007-08-25 12:26 朋友 [未注册用户]

看你的网页眼睛好累!
也许黑底可以省电,或看起来很酷,但文章内容请不要使用白色的字,用黄色或其它柔和些的颜色会好些!   回复  引用    


标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-01-30 12:19 编辑过
 
所属专题: ORM
 


导航

公告

鉴于很多TX投诉黑色背景杀伤眼球,遂换个容易阅读的
!!八强八强!!!!!!! 8-16 21:40
<2008年8月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
31123456

统计

与我联系

搜索

 

常用链接

留言簿(25)

我参加的小组

我的标签

随笔分类(77)

随笔档案(77)

相册

朋友的Blog

同事的Blog

最新随笔

积分与排名

最新评论

阅读排行榜

评论排行榜

60天内阅读排行