84年的矿泉水

博客园 首页 新随笔 联系 订阅 管理

        这个星期虽然工作很忙,但是albian的开发进度还是没有拉下。目前albian已经完成了简单的IOC功能(至少对于albian够用了);还有albian的ORM已经完成的差不多了,下个星期应该可以完成ORM,但是不带cache的。

      这个星期的开发中,也碰到了一些问题。记录下来和大家一起探讨。如果对于这些问题有更好的解决方案,欢迎联系我。

      1.ORM中的Save功能。其实Save功能很简单,它主要完成的工作就是向数据库中insert或者update一条数据。当需要save的记录不存在于数据库中时,就采用insert操作;当需要save的记录已经存在数据库中时就采用update操作。开始我是想使用Exists,大概的意思就是这样 if exists select 1 from table where pk update……. else insert….,但是因为albian需要支持异构数据库,这条语句在mysql中不能被执行,只能作罢。但是save功能一定要提供,所以只能另找出路。想到了按照不同的数据库采用不同的方法,比如刚刚那个if exists select 1 from table where pk update……. else insert….结构就用在mssql中,然后mysql中使用mysql的方言提供……,这倒未必不是一个好的办法。但是在这种办法的实现在代码上有一定的臃肿而且增加了难度,至少3个方法,然后委托执行。然后就想到了另外一个办法:使用显示的本地对象属性和alibian的orm中所拥有的isnew属性,这样就可以区分对象是否是新的。然后按照isnew属性拼凑sql语句,当isnew为true时需要insert,反之则update。这样既不会出现臃肿的sql语句,还会准确的表达代码的意义。唯一的不好就是需要在每个使用albian orm的数据层对象类实现中需要实现IAlbianObject接口,虽然以前也要实现IAlbianObject接口,但是现在的接口已经不是简单的签名接口了,需要实现两个属性,一个数Id(即数据库的主键),一个是IsNew属性。幸好只是属性,所以实现这个接口需要花的时间不长,而且也非常简单,只是简单的实现属性即可。

     2.IOC的问题。以前也用过IOC,比如spring等等!但是这些IOC给我的感觉就是太重了。虽然spring其实来自于j2ee的改良,但是对于一般的app来说还是太重,配置太多、太复杂。几乎支持了所能想到的所有的注入方式。但是对于Albian来说,其实它的重点在于ORM(其实99%的app重点都是在于和数据库交互),所以IOC只要是够用就可以了。鉴于这个思想,albian实现了一个super轻量级的IOC,不过已经完成了最简单最实用的定义和实现分离。不过虽然简单,albian IOC还是支持loading所有的ioc对象,并且没有前后位置关系的限制;但是对于相互交叉使用的对象,在启动时会报异常,需要程序员通过别的方式来完成相应的功能。

      3.构建查询。对于一个企业级的框架而言,特别是在电子商务这种行业,数据库查询功能永远都是最重要的。在构建查询的时候,曾经想过为了数据库吞吐增加效率,增加查询时指定字段的功能,在实践中,确实也增加了这些功能的接口。但是真正在开发过程中发现了此举其实并不一定增加了app的运营效率。从数据库访问来看,增加了需要查询的指定字段,确实增加了数据库的吞吐效率,因为使用指定字段时每次都会load需要的字段,那些不需要的字段就不会被select出来,这样加快了数据库的查询速度,减少了数据库的吞吐量。但是从整个app(db+app应用程序)来看,其实有的时候反而倒是会减少了整体效率。原因是假设我们的读写比例是4:1(已经很少了,基本上都在9:1左右),我们一个展示功能不太可能只是用一次的指定相同字段查询就可以完成,所以如果采用指定字段,就会出现一个cache过多并且命中率下降的问题。但是如果不指定字段,那么不管你查询什么字段,只要你的pid一样,我就可以优先使用缓存中的对象,这样可以极大的减少对于数据库的压力,而且如果使用本地缓存,那么对于多服务器的缓存同步问题也会容易很多。所以从app的整体考虑点出发,最终还是放弃了指定字段接口,但是这个功能不是没有用处。比如taobao、ebay,当数据库中的表字段多到一定的量,而且当缓存同步的代价小于多缓存内存消耗的代价时,这个接口就有用了。

      后面的事情:

      接下来的事情主要就是完成ORM,目前留下的工作就是完成查询功能和缓存功能。缓存提供两种接口:分布式缓存和本地缓存。故因为可能会启用本地缓存,所以需要增加缓存同步的功能。这部分工作原来准备使用remoting完成,但是后来想到可能很多公司一个系统本身就是异构平台的,而且albian本来就打算后面会移植到java去,所以albian本身也是异构平台的,这部分开发应该会使用原始的TCP来完成。同步服务器程序会使用基于linux的c来完成。完成了同步程序后,对于大型的app还需要一个分布式锁服务器,这部分开发也会使用linux的c来完成。当这些都完成后,albian看上去就会像一个样子了。

posted on 2011-07-11 09:16  xvhfeng  阅读(1774)  评论(6编辑  收藏  举报