云 的个人资料小木屋照片日志列表 工具 帮助

日志


感受《地球脉动》

   最近总是在不同场合不厌其烦地向朋友们推荐这一套BBC的纪录片,《Planet Earth(行星地球)》,又译为《地球脉动》。撷取几个令我感动的画面,和大家分享。


    沙漠里久旱之后的一场甘雨,荒芜如火星般的地表忽然奇迹般地焕发出勃勃生机。沉寂地下可能长达三十年的种子争相萌发,绚丽夺目的小花布满整片山谷。数天之内,它们生长、开花、凋谢、死去,完成一次轮回。种子继续埋藏,静待下一次但却不知是何年何月的生命怒放。
    中国四川,大熊猫的栖息地,剪接之后的超长镜头,从料峭寒冬,白雪初融,到春去秋来,花开花落,漫山遍野的杜鹃、散落其间的樱花,两分钟内,沧海桑田。
    委内瑞拉平顶高原,柯南道尔的“失落的世界”。世界落差最大的瀑布从峰顶流下,陡然急降近千米,水雾在阳光下幻化出绚烂的彩虹。在这样的激流里,居然生活着不少动物。为了生存,在与水流的力量抗衡的斗争中,它们各显神通。
    智利海岸,终年无雨。但仅仅凭着云雾带来的水汽,就给沙漠带来了生命的奇迹。仙人掌在夜间绽放美丽花朵,花蜜成为迁徙的鸟儿沿途的美餐。无论在什么恶劣的环境,只有一点点的可能,生命就自然会找到出路。
    数量多得足以遮蔽天空的候鸟群,令人想起《迁徙的鸟》片尾曲中的动人词句:Over the shifting desert plains, across mountains all in flames. Through howling winds and driving rains, to be by your side.
    飞越喜马拉雅,是蓑羽鹤每年迁徙的必经之路。面对世界上最高的山脉,面对随时刮起的强风,面对虎视眈眈的天敌金雕,面对生死之间的挑战,蓑羽鹤忍着寒冷和饥饿,一下一下地展翅爬升,从绵延雄伟的雪山群上掠过,去往那温暖的越冬家园。
    生活在K2地区的雪豹总是踪迹难觅,拍摄人员隐藏等待三个月,终于看到它们出现在贫瘠而险峻的山地上。行走、跳跃、捕猎出击、一举一动都是那么优雅动人,堪称荒野中最美丽的风景。
    每年往返于地球两极之间的蓝鲸,在深蓝色的海上穿行,泛起阵阵白色浪花。虽然由于人类捕杀,数量已锐减至不足万头,但这种世界上最大的动物依然在穿梭于广袤的大洋,浮沉之间,宛若游龙。
    十小时在狭窄洞穴里的艰苦穿行,展现眼前的可能是世界上最美的洞穴景观。龙舌兰洞的“灯饰”大厅,自然与时间的妙笔,令石头变成了晶莹闪亮的花簇,而遍布岩壁上的嗜极细菌,更是无视生命无法脱离太阳存在的普适定律,发出的光芒如同宇宙中的点点寒星。
    成千上百的帝企鹅挤在一起,以相互的体温抵御零下40度以下的严寒和秒速30米以上的暴风雪,确保身体下面的蛋能平安度过世界上最漫长的黑夜。当新年的第一缕阳光洒落,当地平线上渐次出现雌企鹅的身影,生命的希望之火重燃。
    马达加斯加的静夜里,风云变幻,雨季来临。受到雨水的滋润,高耸入云的猴面包树顶端如魔术一般瞬间开满了长达一尺的花。花蜜成为狐猴、鹰蛾的美味琼浆,而掠食者又反过来成为授粉者。自然生态链的神奇表演就是如此的和谐。
    十七年的地下等待,一个月阳光下的生活,成千上万的十七年蝉涌现,给森林以及森林里的生物带来养分和食物,在种下希望之后死亡。要听到它们在枝头鸣叫,要再等待十七年。
    没有一丝阳光到达的深海,一座火山或一股潜流就可以带来无限生机。色彩斑斓的珊瑚、海绵,千奇百怪的鹦鹉螺、章鱼,在这个似乎被世界遗忘的角落,生命依然精彩。
    片子里,这样的画面比比皆是。超过五年的拍摄,浓缩而成十小时镜头前美轮美奂的世界,制作者用心述说着地球的故事。从北极到南极,让你感受淡水、荒漠、山地、洞穴、冰原、草原、森林、丛林、海洋等多姿多彩的自然环境下地球时刻跳动的脉搏。


    曾经见过有人问,如果向一位外国人推荐三部中国电影,你的选择是什么。这个问题的答案自然见仁见智。但如果一位外星人新朋友想通过影像记录来了解地球,那么《Planet Earth》应该可以位列其中。而作为地球人的我们,又怎么可以错过如此精彩的地球脉动呢。

饕餮星期六 20091031

记录下今天的饭菜,不然忘记怎么做。

早上的粟米猪腰香菜粥。玉米粒要先放。
猪腰是妈妈动手处理的,要浸水挑筋。用了半只。
切片之后和香菜一起放下去滚熟即可。

然后是午餐晚餐的汤。

原料有:
家猪猪肚一只。

//猪肚的快速处理方法:先洗并反转,然后在炒锅里放一些盐,大火炒热之后放下猪肚,用锅铲撮擦之。然后拿起冷水冲后,用菜刀刮之,就可以弄得干净了。

鸡半只。如人多,一只也可。

淮山一段。

其它煲汤料(猪骨若干,北芪,杞子等若干,姜一小块拍碎,敲碎的胡椒少许)。

先将鸡之外的材料放入汤煲中,大火煲滚。

关火。将鸡整块放入,浸20分钟(如果是整只,浸25-30分钟,以浸熟为准,筷子轻松穿过即为熟)。
一定要关火后浸,这样鸡肉就滑且爽,而汤也吸收了鸡的鲜味。

将鸡捞出,切开备用。

开火将汤煲滚之后小火继续煲,1小时后将猪肚捞出切开,备用。

汤继续煲半小时后完成。

这时候可以做的东西就多了。

可以猪肚鸡用那种潮州咸酸菜煮,特别好吃,上次同事来吃的时候,连汁都喝得干干净净。
不过就用芡兜热也挺好吃了。

将剩下的半只猪腰炒熟,然后和1/3猪肚一起用酱油麻油兜一下,就是我们的午餐。

晚餐有客人,所以除了剩下的猪肚鸡之外,还将做一个五彩炒粒粒。
原料有:青瓜,冬菇,胡萝卜,玉米,沙葛,猪肉,均切粒。香菜少许切碎。



//猪肉要预先腌好。调料的先后顺序是:盐、酱油、胡椒粉、糖。然后是生粉,最后少许生油。先下盐,比较入味,生粉令肉爽滑,最后生油包住外面,炒起来就比较香。

成品:


最后附送水果和零食。
腰果是上次在香港买的生腰果,用盐水煮熟,沥干之后用微波炉叮2分钟,又香又甜。

Eclipse快捷键大全

Ctrl+Shift+L 列出所有快捷键的快捷键,哇哈哈

推荐《Dreaming in Code/梦断代码》

      好书!内容好,文笔好,翻译好。作者引经据典,妙笔生花。译者信手拈来,举重若轻。读至精妙处,每每为之击节。这几天一直在读,至深夜而手不释卷。

      此书基本上不属于技术类书籍,但我觉得应是程序员所乐于见到的故事和文字。严重推荐给曾经是程序员或者仍是程序员的同学们。

附:

本书英文版网站:http://www.dreamingincode.com/

中文版网站:http://www.dreamingincode.cn/

书中主角Chandler项目网站:http://chandlerproject.org/

分享我的a-z网址列表

感谢firefox的地址栏网址模糊匹配功能,让我们可以轻松知道自己最常去的a-z网址列表。

a: analytics.google.com  google的网站访问分析工具,对于个人用户来说,自恋必备。

b: baidu.com 偶尔用用,毕竟在国内,google有被和谐的时候。

c: cloudsoil.blogbus.com pup的博客《绝版旅途》

d: docs.google.com google document,google的在线文档系统,任何地方管理你的文档,目前是俺写草稿(文章/攻略/技术笔记)的地方

e: 无

f: 曾经是facebook.com,现在已经不上,而且上不去

g: google.com 毫无疑问

h: hoopchina.com 可能是最好的篮球论坛

i: 无

j: 无

k: kaixin001.com 开心网

l: littlecabin.blogbus.com 俺自己的博客,或者是littlecabin.spaces.live.com

m: map.live.com 相较而言,live的地图挺好用,尤其是查公交线路

n: www.newegg.com.cn 新蛋,主要是之前一段时间要买电子产品,上去格价

o: 无

p: picasaweb.google.com 又是google。不过最近被和谐,访问频率排行已经让位给ppluxx.blogbus.com,luxx的博客

q: qunar.com 去哪儿网站,搜机票首选

r: reader.google.com  google reader,基本上是每天都要看的

s: www.szlib.gov.cn 深圳图书馆网站,检索/预约借书/续借。排第二的是sites.google.com/site/yunjie,俺的google site

t: tvb.com 这个主要是lp上去看剧情预告的

u: 无

v: veryab.com 天威的在线电影网站,仅限天威宽频用户。最近verycd.com也上升得很快

w: web.qq.com web qq,不想开qq客户端的时候就用这个

x: 无

y: www.yingyuan.cn 嘉禾影院的电影排期。曾经是yunjie.googlepages.com,不过google pages已全面迁往google site

z: zhibo8.com 看网络直播的索引网站,电视不直播英超时的无奈选择

0:0dian8.com 同上

 

灵感来自

A to Z of my browser address bar

http://lmel.us/2009/08/my-browser-address-bar/

200909惠东巽寮湾

      上上周末去巽寮湾参加了个活动,不过没啥好说的……收获也就是熟悉一下相机的操作了。

开会的时候闲来无事对着桌上的杯子按快门,因为觉得杯脚的颜色折射到杯壁上很有意思。

开完会已经是傍晚,走到喜来登外面的沙滩,太阳撒在海面上。(说句题外话,明显看得出,不使用佳能默认的照片风格而改用可靠设置,照片色彩会平实和真实一些,没那么鲜艳)

海边有装资的餐桌。

但其实号称中国麻袋,东方夏威夷的巽寮湾,原来就这样,而已。无椰林树影,亦无水清沙幼,大约也就跟深圳的西冲差不多吧。

莲花倒是很漂亮,而且早有蜻蜓立上头。

这里的喜来登和三亚那间设计风格基本一致,但这里的海滩还是远不如亚龙湾的吧。

海边的礁石倒是让我想起阳西的沙扒,回想起7年前沙扒的月光和帐篷外的烛光,还是很有意思的。

这个角度就更像了。

海岸线。

冲击礁石的海浪。

这里比别的海滩优胜的地方就是远眺没有阻挡。

住不起海景的喜来登,晚上下榻的是山卡拉里面的海滨温泉度假村——原来“滨”的范围可以远达十公里。

别野区里面倒是挺整洁。小楼里的会客室也很不错。

 

温泉对住客是免费的,但本来就没什么兴趣,而且天气还这么热。还是随便走走,顺便拍拍花花草草吧。

回到小区里,怒放的风雨花随风摇曳,真讨喜呀。

关于注册Weblogic9为Windows服务的一些细节

    首先,找到的这篇blog的方法是work的,致谢。

    http://www.hashei.me/2009/08/install-weblogic-as-service-and-recovery-password.html/comment-page-1#comment-920

原文如下:

    Weblogic8时代将weblogic注册成为Windows服务是一件很简单的事,只要执行Domain目录下的 installService.cmd即可。不过进入Weblogic9之后,domain目录下就没有了那个脚本,而是出现在%WL_HOME%/server/bin下,直接运行会生成一个“bea _”的服务,运行的话。。。没有任何结果,BEA的edocs上也没有找到有用的帮助。

以下内容,是我盯着installService.cmd和startWeblogic.cmd出神良久后试验成功的。

  1. 复制一份installSvc.cmd到domain目录下,

  2. 编辑installSvc.cmd,在set WL_HOME=……   下添加set DOMAIN_HOME=<你的domain目录>

  3. 将下一行的call “%WL_HOME%\common\bin\commEnv.cmd”修改成call “%DOMAIN_HOME%\bin\setDomainEnv.cmd”(如果这里的setDomainEnv.cmd写完整路径,那么上一步 DOMAIN_HOME可以不用设置,因为setDomainEnv.cmd里还会声明一遍的)

  4. 另起一行,添加两行“set USERDOMAIN_HOME=%DOMAIN_HOME%”“set DOMAIN_NAME=<你的domain名字>”(这是脚本最末一段Install the service里beasvc命令所需要的参数)

  5. 运行installSvc.cmd,会在服务里新建一个名为“beasvc %DOMAIN_NAME%_%SERVER_NAME%”的服务,自动运行,帐户属性的是localsystem。

beasvc命令各个参数的详细意义可以参考beasvc /help

   以上内容对于Oracle Weblogic 10依旧有效。

 

    这里面有个问题,就是如果之前改过startWebLogic.cmd的参数,例如MEM_ARGS,file.encoding等等就不生效了,因为注册服务的脚本并不是通过startWebLogic.cmd启动的。所以你的参数需要在installSvc.cmd脚本中重新设定(最终体现在CMDLINE)。特别注意此脚本中的跳转(goto)语句,确保你自己的语句会被执行到。

    可以到注册表 H_L_M/SYSTEM/CurrentControlSet/Services/你的服务名 下查看服务是否正常。CMDLINE在Parameters下。直接修改这里再重启,也可以生效。

增丰漂白记

       哦,不好意思,应该是增城大丰门漂流及白水寨游记。上上周末被携去了增城游玩了一转,流水帐记之。

      周六早上9点多出发,不一会就奔驰在广深高速上。太久没有跟过团,听着导游bilibala,感觉还挺新鲜的,还知道了不少关于增城挂绿、何仙姑庙、水淹广本等逸闻。午饭是在小楼镇吃盆菜——其实就是鸡鱼肉丸香菇粉丝菜心鱿鱼萝卜冬瓜等等堆在一起而已,素菜在底,荤菜在面。荤菜味道一般,倒是素菜吸饱了肉汁,相当美味,客家菜还是蛮对我胃口的。

      下午是大丰门水库漂流,水质不错,激流不少,沿途景色也还好,还是值得推荐的。但不知道为什么没有6年前第一次漂流时紧张刺激的感觉了。

      晚上入住百花山庄,此行的一大惊喜!房间的无敌湖景让人心旷神怡,连没有相机且不喜拍照的俺都忍不住抢过knapweed的htc手机拍了几张。

 

落地玻璃窗外,有山有水有广州市户口。可以惬意地埋在沙发里放松心情。

清晨,电动窗帘拉开,一面湖水。

下楼去散步,有点像海洋公园表演台的游泳池也不错。

还有小花。

 

 

      第二天去爬白水寨。号称有9999级台阶,其时候4999后面似乎没什么好看的景色了。开始时是海船木栈道,走起来非常舒服,中间有很小一段比较陡,和丹霞山类似,但其实穿着临时买的拖鞋的knapweed也只花了2小时不到就爬到了4999级台阶,也就是白水寨瀑布的上方。沿途从不同的角度看这个号称我国大陆落差最大的瀑布。Angel Falls也就1000米左右,白水寨也400米了呢,所以还是相当有气势的。

 

从上往下看。

      4999级台阶处是所谓的天池,一般般了。

      天池旁边旁边就是车站。从这里坐车到山脚起点,山路盘旋,还需要40分钟,估计原路走下去也差不多这个时间。只是天降大雨,还是省了这脚力吧,免得变成落汤鸡。

      在山脚饱餐之后,尽兴而归。真是一块的周末啊。

通知,通知,博客搬家

      鉴于live space一丑二慢三越来越不像博客,现将博客搬至博客大巴,死背死不再更新。原有文章已搬迁,可惜搬评论过于复杂,只好放弃。

新博客地址:http://littlecabin.blogbus.com/

RSS订阅地址:http://littlecabin.blogbus.com/index.rdf

或使用以下链接:

  • RSS 什么是RSS?

    订阅到Google阅读器

    用IM提醒我内容更新

    订阅到QQ邮箱

    订阅到鲜果阅读器 

    订阅到抓虾阅读器

  • 没啥事,就是耕耕

          话说上两个星期有一天,两家软件开发商为了一个接口的事情差点打起来,那场面火药的,俺还真没见过这么冲动的技术人员。其实隔岸观火挺有意思的,不过为了项目的大局着想,还是不能太置身事外,最后站出来把火给灭了。我又想起了老王跟我说过的话,挺有道理:“只有家里人的事情,才值得你去急。为别的事情急都是划不来的。”

          抽空一股脑儿把身份证户口本护照结婚证都扫描了,以后要复印件随时打印出来就行。去新加坡真是又贵又麻烦,要准备的资料一大堆,住又死贵死贵,还没啥特别好看的地方。要不是为了打企鹅和捉龟,肯定不去了。这也是我一直不愿意出国游的原因之一,签证费都能硬座到北京了。唉,咱天朝的护照就是那么的不受人待见啊。

          luxx从中东回来了,谈到埃及的时候拿吴哥来对比,字里行间极为推崇吴哥,让我对旅途又多了一份期待。看来要先去图书馆找几本柬埔寨的书来瞅瞅才行。

          Windows2003上装不了Live Writer,折腾了好一会,最后从XP上面把安装好的直接copy过来,居然就能用了。

          某天晚上心血来潮把google site换了个主题。

          再过几天侄子就两岁了,时间过得真快。

    http_imgloadCA2KCE6H

    我的快乐山寨年代

    (团刊征稿关于山寨,胡乱写了几句。但其实我想写的是这篇。)

        上大学的时候,囊中羞涩,无奈有着一颗驿动的心,总是忍不住想出去徒步旅行。奖学金都用作生活费了,兼职的一点微薄收入要好好规划使用。旅途中的交通费用是没法节省的,只好在装备上下功夫。众所周知,户外店的咚咚都死贵死贵的,于是山寨就成了最好的选择。
        背包是最标准的山寨产品。一个当年还不太有名的国产品牌,仿BigPack的C-R背负,看上去很pro的样子。可一旦负重超过25斤,那真是如同背着三座大山,所以,不让背包重量超过30斤是铁一般的定律,腐败物资一律抛弃,要带的东西能少则少,减负是每次旅途中贯穿始终的话题。好的背负系统确实很重要,但没办法,谁让它容量大、功能全、坚固耐用之余还能比正版背包便宜一半有多呢。
        Sigg水壶咱是买不起了,十五块的军用壶也挺好,还带饭盒!虽说吸入铝太多会容易老年痴呆,但一年也没用几回,将就一下得了。
        户外的防风帽属于奢侈品,根本不在考虑之列。还是DIY一个吧,一顶普通的帽子,加上两枚扣针一片布,后颈部从此免除风吹日晒之苦。
        鞋子稍微没那么含糊,贵达99大元,底胶不错,号称Vibram的,鞋面有Merrell的logo——可除了拼写没有错误之外,咋看也不像真的。防水性能倒是还行,至于透气与否,懒得管它。人家写《藏地牛皮书》的一直,不是一双球鞋走天下么,咱好歹有一双所谓的登~山~鞋~呢。
        快挂既然不是拿来登山,就不是性命攸关的事情,那何必买那么贵的正品呢。挂挂毛巾和水壶,路边小摊上两元三个的那种就不错。
        炉头也是最便宜的那种,不带点火的,能正常出气就行——自己带个打火机,价格便宜量又足,还不容易坏。
        手套那是最好办的了,劳保白手套,一块钱一双,每次回来洗洗还能重复使用,就算脏了破了扔掉也不心疼。
        Coolmax的快干衣、Gore-tex的冲锋衣、凉鞋、雪套、手杖、头灯……一切皆可山寨,而且价格便宜量又足。至于质量,普通的旅途足以应付了。
        装备虽然简陋,但心是幸福而充实的。它们就像多年的好友一样,陪伴我一路走来,走过三峡的栈道和四姑娘山的垭口,走过塔什库尔干的残垣和额尔古纳河的右岸,走过虎跳的峡谷和梅里的转经路,走过那个我无比怀念的快乐年代。

    准备打企鹅啦

    已创建 : 24 Aug 2009

    通过……预订。 : 新航票务办公室/旅行代理

    下列所示行程为您的订位记录明细。您需持有效 机票 ,方可搭乘该航班

    乘客  MR YUN

    您的航班

    星期三 30 九月 2009

    航班 启程 抵达 站点 机舱等级

    SQ865 香港(HKG-香港) 航站楼1 18:30  新加坡(SIN-新加坡,樟宜国际) 22:10  直达 经济舱 (B777-200)

    星期五 02 十月 2009

    航班 启程 抵达 站点 机舱等级

    MI618 新加坡(SIN-新加坡,樟宜国际)航站楼2 16:10  吴哥窟(REP-吴哥窟,高棉) 17:20  直达 经济舱(AirbusA319)

    星期三 07 十月 2009

    航班 启程 抵达 站点 机舱等级

    MI607 金边(PNH-金边,高棉)18:10 新加坡(SIN-新加坡,樟宜国际) 21:10 直达 经济舱 (AirbusA320)

    星期四 08 十月 2009

    航班 启程 抵达 站点 机舱等级

    SQ856 新加坡(SIN-新加坡,樟宜国际)航站楼3 09:45  香港(HKG-香港) 13:30 直达 经济舱 (A380-800)

    ympk

          没想到也要在这里说一句“好久没写东西了”。生活纷繁杂乱,发呆的时间被割裂,偶尔有些话想说,却总被别的什么事情冲得七零八落,最后只能变成开心网上面支离破碎的记录了。

          这段时间生活充实而空虚。这也许是很多人当前的状态?每天被琐事缠绕,岁月不知不觉地从指缝间溜走,却没有留下任何印记。上午讨论吴哥行程的时候,突然发现06年的五一假期是个断层,而且根本想不起来当时做了些什么。如果断层越来越多,那可不是一件好玩的事情,于是决定还是要继续坚持码字的习惯。

          幸而打球和阅读的习惯坚持了下来,相当多的快乐来源于此。动静之间,心态就会变得平和。

          朋友们似乎也没有什么好消息,海儿姐姐说准备离婚;熊的父亲不久前过身……生活的压力逐渐转移到我们这一代人。大约是这个原因让大家渐渐疏于联系吧,虽然,牵挂的心还在。

          今天同事打电话来,闲聊之余说起工作,他说我现在是抢手货,个个科室都想要。结果lp说,其实不就是一颗螺丝钉,用处还不小,但是不重要。惨遭了,ympk。

    猜想:磁盘分区边界对齐对虚拟机io性能的影响

          昨天做了个VM,直接在装Windows的时候分的区,结果在操作涉及大量文件读写的时候(例如:在eclipse中对svn repository relocate,需要更改所有.svn目录下的Entries文件;10个线程的ftp下载;search文件数量非常多的目录等)就会停顿,假死。

          怀疑是虚拟机磁盘io的问题,重新做了一个VM,在安装系统前,winpe启动,用diskpart分区,在create partition的时候加上align=64的参数,让分区边界对齐。再装系统之后似乎停顿的现象少了很多。

          使用HD Tune做了一下简单测试,做了对齐的VM磁盘性能明显优于第一台。特别是在随机读写数据大小为512k时,有5倍以上的差别。

          如果你是虚拟机管理员,最好是做一个优化好的无敌模板,省力又省心。

          网上这篇文章说得好像算明白了,看上去像是翻译的(就不能翻译得好点吗?!)。

    http://jackiechen.blog.51cto.com/196075/163284

     

    以上为无责任评测。

    hibernate使用Weblogic datasource的事务问题

        在hibernate中配置使用weblogic datasource比较简单,在hibernate.cfg.xml文件中将直接jdbc连接的配置:

    <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
    <property name="connection.url">jdbc:oracle:thin:@192.168.1.1:1521:orcl</property>
    <property name="connection.username">tiger</property>
    <property name="connection.password">scott</property>

    替换成:

    <property name="connection.datasource">myDatasource</property>
    <property name="jndi.url">t3://localhost:7001</property>
    <property name="jndi.class">weblogic.jndi.WLInitialContextFactory</property>

    即可。

    如果有需要,也可以加上connection.username,connection.password两个配置。

    但是如果事务配置沿用之前的:

    <property name="current_session_context_class">thread</property>

    而weblogic中配置的datasource又是默认设置的话,就会报事务的错。错误信息如下:

    java.sql.SQLException: Cannot call Connection.commit in distributed transaction. Transaction Manager will commit the resource manager when the distributed transaction is committed.
    at weblogic.jdbc.wrapper.JTSConnection.commit(JTSConn ection.java:628)
    at org.hibernate.transaction.JDBCTransaction.commitAn dResetAutoCommit(JDBCTransaction.java:119)
    at org.hibernate.transaction.JDBCTransaction.commit(J DBCTransaction.java:95)

    大概的意思是无法在一个分布式的事务中提交。个人猜想,问题应该是出在hibernate和weblogic都有自己的事务管理,所以就变成distributed transaction了。

    解决的办法有两个:

    1.配置weblogic datasource时,将Honor Global Transactions option这个选项uncheck。(注意此选项只能在新建数据源的时候配置,如果你已经有一个数据源,只能删除重建了)。

    2.不修改数据源,使用jta,并且将jta的事务管理配置成weblogic的。具体方法是在hibernate.cfg.xml中删除原来thread的配置,然后增加这几行:

    <property name="transaction.factory_class">org.hibernate.transaction.JTATransactionFactory</property>
    <property name="transaction.manager_lookup_class">org.hibernate.transaction.WeblogicTransactionManagerLookup</property>
    <property name="current_session_context_class">jta</property>

    个人觉得第二种方法比较好,原因:(1)weblogic在Honor Global Transactions option的说明里提出,uncheck这个选项非常少见而且有风险;(2)你不一定有权限修改datasource的配置。

    The fox and the child

     

           童话般的故事,童话般的风景,童话般的心。在狐狸的引领下,顺着小女孩的视野,我们看到和听到了一曲优美悦目的森林之歌。那些无知无畏的历险、孩子气的自语、会心的微笑、风过林间的呢喃、飞舞花间小昆虫、笨棕熊和笨刺猬,简直就是一首大自然的诗。

          多谢肥星的推荐,影片下载很长时间了,今天才静下心来细细地看了一遍。那一幕幕拨动心弦的美丽画面,值得我酝酿已久的期待。

          其实我觉得电影和《小王子》没什么关系啦,除了一点,它们都是我所喜爱的。

    ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值

          最近项目中需要在一个表的字段中插入长的字符串,数据表中该字段的类型是varchar2(4000),结果发现,当字符串长度在1000~2000之间的时候,就会报错,而当字符串长度在1000以下或者2001~4000的时候都没问题,显然这是Oracle的一个bug。错误信息如下:

    15:59:46,953 ERROR [JDBCExceptionReporter] Could not execute JDBC batch update
    java.sql.BatchUpdateException: ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值

    at oracle.jdbc.driver.DatabaseError.throwBatchUpdateException(DatabaseError.java:343)
    at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:10656)
    at org.apache.commons.dbcp.DelegatingPreparedStatement.executeBatch(DelegatingPreparedStatement.java:231)
    at net.sf.hibernate.impl.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:54)
    at net.sf.hibernate.impl.BatcherImpl.executeBatch(BatcherImpl.java:126)
    at net.sf.hibernate.impl.BatcherImpl.prepareStatement(BatcherImpl.java:59)
    at net.sf.hibernate.impl.BatcherImpl.prepareStatement(BatcherImpl.java:56)
    at net.sf.hibernate.impl.BatcherImpl.prepareBatchStatement(BatcherImpl.java:109)
    at net.sf.hibernate.persister.EntityPersister.insert(EntityPersister.java:460)
    at net.sf.hibernate.persister.EntityPersister.insert(EntityPersister.java:442)
    at net.sf.hibernate.impl.ScheduledInsertion.execute(ScheduledInsertion.java:29)
    at net.sf.hibernate.impl.SessionImpl.executeAll(SessionImpl.java:2418)
    at net.sf.hibernate.impl.SessionImpl.execute(SessionImpl.java:2371)
    at net.sf.hibernate.impl.SessionImpl.flush(SessionImpl.java:2240)
    at net.sf.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:61)
    at org.springframework.orm.hibernate.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:386)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:314)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:189)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:134)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:148)
    at $Proxy121.saveUserAuth(Unknown Source)

        如果把insert或者update语句直接在PL/SQL里面跑,或者拼成sql语句在程序里执行,都是没问题的,但是如果是用ojdbc驱动的方法(包括hibernate),就会出错。此外,在另外一台Linux的机器上的Oracle9.2.0.8就没问题(生产机是Windows系统,Oracle9.2.0.1)。

        经过google和多个交叉测试,排除了操作系统、中间件平台(Weblogic)的问题。在红伟的指点下,找到这么一个网页,把这个问题的原因说得好像比较清楚(wordpress的,需要翻墙):http://vsadilovskiy.wordpress.com/2007/10/19/ora-01461-can-bind-a-long-value-only-for-insert-into-a-long-column/

        里面提到的解决办法是,用新版的ojdbc驱动,然后把OracleDatasource的oracle.jdbc.RetainV9LongBindBehavior属性设为true,经测试,并不生效。测试了从Oracle网站下载的不同版本(9i,10g各小版本)的ojdbc.jar,情况依旧。

          最后,把生产机的Oracle升级到9.2.0.8,问题解决

    ------------------------------------------------------------

    附:上面提到的网页的文字拷贝

    ORA-01461: can bind a LONG value only for insert into a LONG column

    October 19, 2007 — Vlad Sadilovskiy

    Just one another issue with JDBC I think is worth mentioning. You perhaps wonder why so obvious error message could be troublesome to comprehend. Unfortunately, it speaks of things that a developer never meant to happen. It doesn’t have to be a LONG value. This error could appear when ASCII strings are bound for VARCHAR2 columns. In this case it happens when JDBC v. 10.1/2 is used with a Oracle Server 9i database configured for multi-byte character set. Before going any further, please note that according to support matrix Oracle JDBC 10g and 9i are cross supported with Oracle Server 9i and 10g.

    For the testing I used two databases Oracle 10g and Oracle 9i with database character set UTF8 and JDBC 10.2.0.3.

    Some of the Asian language characters can consume up to 3 bytes in UTF8 encoding. But can you expect that a string composed of 1334 ASCII characters would not bind for VARCHAR2(4000)? However, it is possible. Let’s dig up little more details.

    Here is how the string of 4000 “a” characters would appear to the Oracle 9iwhen bound from JDBC 10g with default properties. This bind is not spooled into the 10046 trace file. Instead it can be captured by enabling stacktrace dump on 1461 event.

    bind 19: dty=1 mxl=4001(12000) mal=00 scl=00 pre=00 oacflg=03 oacfl2=10 size=4000 offset=0
       bfp=ffffffff7cd7f060 bln=4000 avl=00flg=05

    Oracle Server 10g. Note, that when you test this scenario, there are no errors – Oracle Server 10g  is perfectly fine with the 12000 bytes in the private buffer.

    Bind#19
    oacdty=01 mxl=4001(12000) mxlc=00 mal=00 scl=00 pre=00
      oacflg=03 fl2=1000010 frm=01 csi=871 siz=4000 off=0
      kxsbbbfp=ffffffff7b55a0c0  bln=4000  avl=4000  flg=05
      value="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....

    According to Metalink Note: 3756847.8 this problem was introduced in some 10.1 versions of JDBC, but was fixed in 10.2. However, it is not enabled by default. Following JDBC connection property enables the fix.

    java.util.Properties props = new java.util.Properties();
    props.put("oracle.jdbc.RetainV9LongBindBehavior","true");
    ods.setConnectionProperties(props);
    ods.setURL(url);

    And here is how the bind looks like after the fix is enabled.

    Oracle Server 9i:

    bind 19: dty=1 mxl=4000(4000) mal=00 scl=00 pre=00 oacflg=03 oacfl2=10 size=4000 offset=0
       bfp=ffffffff7cd56088 bln=4000 avl=4000 flg=05
       value="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...

    Oracle Server 10g:

    Bind#19
    oacdty=01 mxl=4000(4000) mxlc=00 mal=00 scl=00 pre=00
      oacflg=03 fl2=1000010 frm=01 csi=871 siz=4000 off=0
      kxsbbbfp=ffffffff7b56f060  bln=4000 avl=4000flg=05
      value="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...

    There is no need in enabling this fix for 10g/10g setup. 10g version of the trace is shown just for comparison purposes.

    In conclusion I want to clarify that this article describes the unexpected behavior with legitimate length values. However, there are other cases when apparently correct values fail to insert with same message. I.e. already mentioned strings that, when using UTF8 for database character set, can expand from 4000 Asian language characters to up to 12000 byte values. In these cases, Notes: 241358.1, 370438.1 recommend different workarounds. Note: 445072.1  has decent example of getting the length of encoded string and suggests converting VARCHAR2 columns into CLOB if encoded string length exceeds maximum length of VARCHAR2 type.