-
[Java]简单的延迟初始化实现
本篇文章本来打算在上个月下半旬写的,不过个人状态一直都不太好,最近重新开始调整自己的技术心态,慢慢恢复,这篇也算是恢复中的一小步吧。 延迟初始化是我在上个月公司的一个项目中加入的一个技术,感觉小组对这种东西不感兴趣,所以还是放到自己的博客上来了。技术背景是业务对象是一个非常大的对象(胖领域模型),每次加载非常耗时,而且因为部分非关键服务的不稳定导致不需要这些服务数据的功能不可用。举个例子,导航页不需要用户的B信息,但是每次加载用户信息由于是在服务层(是的,传统的分层结构)加载的,无法直接控制加载的内容,所以导致在B服务失败之后,导航页不可用。 从技术角度来说,领域模型完全是保证业务执行的必要条件,但是实际情况并不是所有场景都需要这么严格的领域模型完整性的保证的,所以类似“降级”的处理方式应由而生。具体来说就是“按需加载”。实现“按需加载”的方式不仅仅只有延迟初始化一种,通过服务的参数显示地控制加载的内容也是一种方式,不过存在侵入性和严格的规约,对开发来说并不是那么方便。其实“按需加载”不是只在特定业务场景才有的需求,在ORM上,加载关联数据也是一种典型的“按需加载”。所以亦可以参考ORM在“按需加载”方面的实现。 在讲我的简化版延迟初始化之前,先大致讲下Hibernate这个ORM在按需加载上的处理。Hibernate主要支持one-to-one和one-to-many下的按需加载,Hibernate 3开始支持部分字段的按需加载(CLOB和BLOB不算在内,3之前就有支持)。实现上,部分字段的加载需要bytecode替换,one-to-many是通过改写集合的处理,one-to-one是通过代理对象,具体来说是CGLIB,因为JDK动态代理对象只支持接口。 了解这些对于我的实现有所帮助,不过除了one-to-many很快就能模仿写之外,部分字段的延迟初始化和one-to-one的处理都比较麻烦。one-to-one在查到结果为null时会比较麻烦,从调用上看应该是代理整个领域模型而不是单个延迟加载的对象,这块个人没有细究,因为我后来想想我不需要非常严格的模型字段规约,小小地修改模型理论上也不会有太大问题。而且部分字段的延迟初始化不是类似单个延迟初始化对象就可以解决的。
-
5月冲绳游记
时隔半年多的旅行,这次因为各种原因选在了冲绳。以下就是个人在冲绳的游览经历。 总体来说,冲绳是个不错的海滨“城市”。如果只说海滩的,冲绳有非常多的海滩,而且比起我之前去的青岛的海滨浴场要好很多很多。不过冲绳本身交通不是很方便,只有一条单轨电车,一些巴士,剩下的就只有出租车了。从本岛到离岛上有船,再远点飞机更好。从市区内酒店出行只能靠出租车,没有其他比较自由的交通工具。相比之前去过的大阪要差很多,也不能和上海比。 旅游景点除了海滨之外,浮潜/潜泳,钟乳石洞,菠萝园等等,有是有,但是跨度比较大,这就像之前我在青岛旅游时从一头到另外一头的感觉。交通不方便又不能租车(中国驾照没有加入国际驾照的行列)只能选择出租车,费用还是比较高的。吃的方面,冲绳荞麦面,冰激凌,还有一些日本本岛上也有的东西,海鲜没怎么吃,感觉和三亚一样“宰人”。 总体来说,冲绳是一个属于日本但是又和日本不太一样的地方,毕竟这里离本岛很远,更靠近台湾,有驻地美军,和其他地方不同有很多离岛。如果没法去夏威夷体验海滩的话,这边的海滩非常值得一去,剩下的就看个人喜好了。 以下是一些照片:
-
scala99解题小结(List)
一个月之前,我把之前知道的scala99除了最后两题都做了下。总体来说自己用Scala来解决一些算法问题上有了一些感觉。 scala99的问题分为List,Arithmetic,Logic,Binary Tree,Multiway Tree,Graph和Misc。树和图和之后的问题和算法关系大一些。以下列一些影像比较深的题目。 本次先是List相关。
-
用DLX解sudoku(数独)
最近在做scala99,其中有一道题目P97是sudoku(数独)。一开始我想到的是列举每个空格的可选数字,选择可选数字最少的的格子开始填写。每次填写,修改关联格子的可选数字。再次尝试填写。这里无解条件是存在没有可选数字的格子。还有就是easy或者normal级别的数独一般可选数字都是1个,分批填写很快就能完成。hard或以上就没有那么幸运了,必须猜测然后验证,存在回溯。 这里描述的算法其实就是搜索+启发。启发是选择性地从最少可选数的格子开始。猜测+验证,感觉这个问题属于NP问题。事实上也确实是,而且可以转化为NP完全的精确覆盖问题(Exact Cover),所以这个问题也是NP完全问题。 P97给的答案有两个,第一个就是搜索+启发,第二个是DLX。DLX是Exact Cover的高效解法。本文就是讲如何用DLX来解数独问题的。考虑到scala99上第二个实现大部分都是可变数据,所以我用Java实现了相应算法。
-
finagle简单使用
在看awseome-scala的时候,正好看到了twitter的finagle。自己公司里貌似也有那种关注load balance等的解决方案,不过不是很容易理解。考虑到自己之前几个月都在弄电子技术了,重新弄点网络相关的把。 这次的任务是做了一个thrift+finagle的远程服务调用例子。其实不是很难,如果不是连续碰到finagle的坑的话。finagle是twitter开源出来的一个分布式系统解决方案,毕竟是大公司出来的东西,更新频率特别是文档很低,很多文档基本都是几年前,好在有代码……
-
rabbitmq在scala下的使用尝试
最近重拾scala,由于某些原因想要尝试了rabbitmq。于是便有了这块代码。 刚才重新看了rabbitmq的官网,上面关于scala的客户端的信息貌似更新了?之前那个lift-amqp太旧了,没法使用。不过没关系,这篇就当做了记录下如何在scala的环境下用rabbitmq的Java客户端。如果你想直接用现成的scala客户端,可以参考这里。 首先你要安装rabbitmq,这样之后好测试。mac下用brew安装命令是 $ brew update $ brew install rabbitmq
-
[电子技术]声控小灯
这个项目想尝试的是: 使用ATMega8而不是ATMega328 使用光敏电阻 尝试直接使用干电池而不是锂电池等供电
-
[电子技术]电子时钟组装
这次是组装了一个taobao上卖的散件的电子钟。本来是想着练练焊接的,不过意外地觉得这个时钟设计得还不错。自己也有光敏电阻和温度什么的散件可以考虑下。
-
[Rails]报告批改网站
简单来说,就是一个模仿lang8的网站。自己想要了解自己实现的话要花多久。实际上确实花了很久,特别是批改网站核心的批改页面。 代码在这里 https://github.com/xnnyygn/report8
-
[Rails]壁纸推荐网站
简单来说就是一次ITEM CF的尝试。不过壁纸本身的管理也花了不少时间,ITEM CF是最后才做的…… 源代码在这里 https://github.com/xnnyygn/get-wallpaper 上面第一行是推荐,第二行是最新的,第三行是热度最高的。 所谓ITEM CF推荐就是根据人得到相似的物品,然后推荐给你。 热度最高是按照下载次数来的。 这些都是在网站日常操作中得到数据,然后通过推荐计算得到的。