最近有消息说韩国电信已经在新的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的内存就能满足目标了。
分享到:
相关推荐
自己定义的类似ORM的MySQL数据库增伤改查的框架,直接配置session就能使用,简单的增删改查不用再写sql,方便、灵活。
基于ORM的数据库框架Room,Android原生API,官方推荐使用,类似GreenDAO数据库。
Android Sqlite 数据库通过 ORM 的方式操作起来会方便很多,效率也会提升很多。本课程将会详细讲解 ORM 数据库框架的使用,提升 Sqlite 的操作和开发效率。
用对象关系映射的方式来查询数据库数据,让使用者更加方便,减少代码冗余
基于改进ORM的Oracle数据库异构资源整合方法研究.pdf
对象-关系映射(Object-Relational Mapping...在数据库应用上更有可能会被误用,主要体现在对持久对象的提取和和数据的加工处理上,如果用上了ORM,程序员很有可能将全部的数据提取到内存对象中,然后再进行过滤和加工处
关于SQLite,ORM,移动数据库,SharedPreferences等Android持久性库的精选列表
c#自定义orm链接sqlite数据库增删改查,基于dapper,自己封装成了自动生成sql的框架:dapper-plus,增删改查可以不用手写sql语句。
本项目为一个简单的JDBC项目,包括:MySQL数据库在idea中的增删改查,JDBC简化,JDBC工具类封装,orm模式,数据库三层架构,JDBC事务 新建一个ProductManager的项目,实现利用ORM思想和三层架构以下功能: t_product...
DataDogAuditBundle, 存储 Doctrine ORM的所有数据库更改 审计包这个包为所有 Doctrine ORM数据库相关更改创建审核日志:插入和更新包括它们的差异和关系字段差异。许多到许多关系变化,关联和分离动作。如果有用户...
最最最最最最基础的操作数据库增删改查,支持事务,通用类,理论上支持MsSql,Oracle,OleDb,MySql,Sqlite等。(由于后两种需要额外引入相关Dll,因此本类中不包含实现,自己添加即可。) 本类只是提供一种思路,...
在关系型数据库和对象之间作一个映射,将内存中的数据存储在关系型的数据库中,实现了数据处理层内部的业务逻辑和数据逻辑分离的解耦合。
ORM 数据库 C# .net
本例子是在beego中使用orm,包含基本增删改查用法,和结构。
Django项目orm操作mysql数据库的项目源码,对应博客:https://blog.csdn.net/qq_36274515
封装了oracle mysql sqllite sqlserver等数据库框架,采用了ORM框架模式。使用起来简单,易用,可以去官方网站查看具体的API
基于PHP7.1 +和PDO实现的ORM,支持多数据库,2.0版本主要特性包括: 基于PDO和PHP强类型实现 支持原生查询和查询构造器 自动参数绑定和预查询 简洁易用的查询功能 强大灵活的模型用法 支持预加载关联查询和延迟关联...
Sharp-ORM 2007 实现数据库与C#类的无缝集成。 通过Sharp-ORM自动生成数据库到类的代码,采用三层体系结构设计,屏蔽具体的数据库产品。生成的类可通过自定义的业务逻辑进行扩展。 通过ORM让程序员彻底摆脱书写SQL的...
[Laravel][PHP][教學]_Model#01._Laravel_ORM_系統與資料庫章節介紹
该方法分为三部分:首先利用改进的ORM技术访问多源异构Oracle数据库,从中抽取数据资源,然后对数据资源进行预处理,包括清洗、降维和加载等,最后利用KNN算法对处理好的数据资源进行分类整合。结果表明:与联邦...