- 缓存的readOnly到底有什么意义?
看到的中文文档多数都是对此草草带过,说readOnly为true的缓存是只读,为false的是可读写。可是“可读写”三个字写起来容易,到底是怎么个“可读写”法我却一直没想明白。理想化一点的想法是将vo的内容先写入缓存,然后由Ibatis统一控制其内容的持久化。今天又在设计一个网站的dao层,终于抽空看了看《Ibatis In Action》,这才搞明白,所谓readOnly的缓存,其实就是当应用需要从缓存中获取对象时,Ibatis直接将一个对象的引用传递给应用,因为反正对象是只读的,传递引用无疑会有最好的性能;而readOnly为false时(同时最好serialize为true,这个好理解),Ibatis则传递给应用一个当前对象的副本——恍然大悟。 - 缓存的刷新和过期
Ibatis在设置缓存的时候,有个flushOnExecute的标签,当其中的方法执行时,即刷新缓存。我一直不明白的是,这个刷新缓存,是刷新全部缓存还是只刷新与特定对象相关的缓存。更直接点说,要看这个缓存的Key是Prepare Statement呢,还是Prepare Statement与statement语句参数值的集合。后者的效能显然更好一些,比如我更新了id为1的一条记录,那么只刷新select * from table where id='1'的缓存,而不是刷新所有与之相关的缓存。但是如果这样的话,Ibatis对缓存的管理任务无疑是相当繁重的,而且在设计时大概就需要引入新的标签了。所以看起来前者的可能性更大。
今天也顺便查了《Ibatis In Action》,确实如上所述。如此以来,要想很好的利用Ibatis的缓存,那么在使用Ibatis标签的时候,就要有从更细致的粒度去考虑设计了。
青椒
香菜芹菜辣青椒,茄子扁豆嫩蒜苗,好大的黄瓜你们谁要,一个铜子儿拿两条。
2008-06-16
Ibatis缓存
2007-08-08
Nokia770把玩笔记(1)
看了几个文档,在还没有完全搞清楚状况的情况下,先下载了Scratchbox到我的Ubuntu 7.04环境上,接着才开始读maemo上的Tutorial。
于是,开始下载flasher 3.0和770的Image。
安装Maemo 2.2 SDK。
接下来就发现这些对于基本的软件安装和Hack都是没有必要的。
8月1号,我在770上安装了xterm / locales-extras-cjk_2.3.5-2_all.deb。
如果要安装字体至/usr/share/fonts目录下,必须得到root权限,所以要想办法打开Nokia 770上的R&D模式(即开发模式)或者利用如下办法:
- 安装xterm 和 Dropbear SSH Server;
- 从另一台机器远程ssh登录770主机: ssh root@xxx.xxx.xxx.xxx,默认的root密码是“rootme”。接下来就获得了root权限了。但是,首先要做的是,禁掉root用户从网络访问的可能性,否则,加入一个开放的wifi网络就意味着对外开放了自己770的大门;
- 修改gainroot命令配置,使自己可以在不开放R&D模式的情况下可以获得root权限:用vi编辑/usr/sbin/gainroot文件,修改
为MODE=`/usr/sbin/chroot /mnt/initfs cal-tool --get-rd-mode`
MODE=enabled #`/usr/sbin/chroot /mnt/initfs cal-tool --get-rd-mode`
- 用passwd修改root用户的密码;
- 可选:禁掉root直接访问的权限:
passwd -l root
- 可选:禁掉从ssh访问使用root的权限:编辑/etc/default/dropbear文件,加一个属性:
重启Dropbear即可:DROPBEAR_EXTRA_ARGS="-w"
/etc/init.d/dropbear restart
- 之后,便可以通过sudo gainroot获取root执行权限;
这之后,拷贝字体至/usr/share/fonts目录,执行fc-cache –f 刷新字体cache,重启之后,就可以在浏览器中正常查看中文了。
但若要解决title栏的中文显示问题,仍需以下步骤:
- 在xterm中通过sudo gainroot获取root权限;
- cd /usr/share/themes;
- 进入你想要hack的theme(但要注意,不要是当前正在使用的),如 cd theme2/matchbox;
- 拷贝其中的theme.xml文件到你的可见文件系统当中,如mmc卡上,cp theme.xml /media/mmc1/temp/theme.xml;
- 运行fc-list命令,查看你想要使用的字体的名字,如"Microsoft Yahei,微软雅黑",复制下来,便于下文的修改;
- 在770里,利用文本编辑工具打开这个theme.xml文件,找到这行:<font id="osso-TitleFont" def="Nokia Sans-17.85" />
<font id="osso-TitleFont" def="Microsoft Yahei,微软雅黑-17.85:18px|Nokia Sans-17.85" />
- 保存后,重新在xterm里将此文件覆盖回原来位置;
- 使用你刚刚修改过的theme,就可以解决title栏里的中文问题了。(如果不行,或许你需要重启一次)
续:后来发现,已经有更简单的方法可以代替这些繁琐的工序了,详见后文。
2007-04-02
JettyLaucher是个好东西
使用很简单,用Eclipse的安装工具即可用 http://jettylauncher.sourceforge.net/updates 查找到插件并安装。之后在Run中就能找到Jetty Web的项目,填入一些必备信息,再把jdk/lib/tools.jar加入到类路径中。之后只要一Run,就立即启动了Jetty,非常方便。还可以Debug启动它,支持断点调试。
当然,之前你要先装一个Jetty。
2007-03-23
Python编码规范 (beta)
- 4个空格一个缩进层次.
- 行限制在最大79字符
- UTF-8文件编码
- 在二元运算符两边放置一个空格:赋值(=), 比较(==, <, >, !=, <>, <=,>=, in, not in, is, is not), 布尔运算 (and, or, not)
- 不要在用于指定关键字参数或默认参数值的'='号周围使用空格
- 不要将多条语句写在同一行上
- 注释块(Block Comments)通常应用于跟随着一些(或者全部)代码并和这些代码有着相同的缩进层次. 注释块中每行 以 '#'和一个空格开始(除非他是注释内的缩进文本). 注释块内的段落以仅含单个'#'的行分割. 注释块上下方最好有一空行包围( 或上方 两行下方一行,对一个新函数定义段的注释).
- 一个行内注释(Inline Comments)是和语句在同一行的注释.行内注释应该谨慎适用. 行内注释应该至少用两个空格 和语 句分开. 它们应该以'#'和单个空格开始.
- 为所有公共模块,函数,类和方法编写文档字符串.
- 多行文档字符串结尾的""" 应该单独成行
- 对于CVS的服务器工作标记应该在代码段中明确出它的使用,如:在文档的最开始的版权声明后应加入如下版本标记:
__version__ = "$Revision: 1.4 $"或
# $Source: E:/cvsroot/python_doc/pep8.txt,v $# 文件:$id$ # 版本: $Revision$
class MessageError(Exception):
"""Base class for errors in the email package."""
No: if type(obj) is type(1):
Yes: if isinstance(obj, int):
No: if greeting ==
True: Yes: if greeting:
2007-03-19
[旧文]安装Maven
1.下载Maven(http://maven.apache.org/start/download.html)。
2.双击exe安装文件,指定目录安装。所指定的目录路径请不要有中文,也请尽量避免空格;(我曾经遇到因为空格导致设置不成功的倒霉事儿)
3.检查环境变量。命令行下输入echo %maven_home%,输出的地址应该是指向Maven安装目录的地址,此目录下应该直接可以看到/bin/、/lib、/plugins三个目录以及其他文件等。如果没有输入安装目录的地址,请用命令set maven_home=...设置。同时,你也需要在Path变量中加入指向%MAVEN_HOME%/bin的地址;
4.下面的步骤可选,且可能只对2000以上系统有效:在命令行下输入命令%MAVEN_HOME%\bin\install_repo.bat %HOME%\.maven\repository(注意:%HOME%地址指的是你的用户在系统盘的主目录,例如我的就是C:\Documents and Settings\monkito)。此语句会创建本地依赖库。如果跳过此步骤也没有关系,Maven会通过下载来代替从lib目录复制依赖库;
5.重启系统后,你的Maven就可以正常使用了。你可以通过在命令行中输入maven -v命令来验证是否安装正确。
[旧文]Pluto手记
Pluto 是 Apache开发下的一个Open Source项目(http://portals.apache.org/pluto/), 是基于Portlet Specs的一个 Portlet Container 的实现。(关于Portal,请参考《Portal》)
目前Pluto处于开发阶段,尚未有发布版本面世。为了取得Pluto,我们必须从apache的CVS树上把此项目的开发版本checkout下来。
用Eclipse3.0取得Pluto
打开Eclipse,3.0版本自带有CVS的支持。我们只需在Window > Customize Perspective…中把CVS相关的ShortCut、Commands勾选上即可。然后点击面板上的“Check from CVS”按钮,在打开的窗口中输入apache树的信息:
- Host:cvs.apache.org
- Repository Path:/home/cvspublic
- User:anoncvs
- Password:anoncvs
- Connection Type:pserver
点击Next,在“Select Module”窗口中指定module name:jakarta-pluto,点击Next,便可以从CVS树上取得最新的Pluto开发版本。默认的下载地址在你的Eclipse workspace目录下。
Pluto是利用Apache的另一个项目管理工具Maven(http://maven.apache.org/)来做项目管理的,所以在部署Pluto的时候,我们需要借助Maven。( Maven 1.0-beta-10 or higher )
安装Maven
此部分可参考《Maven手记》,此处略。
部署Pluto
首先,我们需要修改Pluto根目录下的build.properties.sample文件,并将其重命名为build.properties: 指定 maven.tomcat.home到你的要部署Pluto的Tomcat安装目录。注意,目录路径中的"\"须换为"/"方可正常工作。
修改Pluto根目录下的project.properties文件,添加参数maven.repo.remote=http://public.planetmirror.com/pub/maven,
http://mirrors.sunsite.dk/maven/,http://www.ganet.org/maven/,这三个url地址用来从远程下载需要的依赖包,默认的http://www.ibiblio.org/maven地址总是不太灵光。
在Pluto根目录下执行maven fullDeployment,Maven 便会自动开始部署Pluto,如有本地没有的包,Maven会自动从远程库中下载。(注意:如果部署过程中下载依赖包出错,请在%HOME%\. maven\repository中找到下载不成功的包并删除,之后再重新执行Maven命令,否则会在部署过程中出现找不到包的错误提示。)
如果部署顺利完成,我们就可以启动Tomcat了,在浏览器中输入地址http://localhost:8080/pluto/portal就可以看到Pluto的test unit界面了。
参考资料
Pluto
http://portals.apache.org/pluto/
Maven
http://maven.apache.org/
http://maven.huangdong.com/
项目管理:Maven 让事情变得简单
http://www-900.ibm.com/developerWorks/cn/java/j-maven/
[旧文]关于Partal
什么是Portal?Portal就是门户。
Portal包括:
(1) Portal Server。『Portal Server是基于WEB的应用程序, 它将不同资源进行整合并展现给用户。有些文章直接把Portal Server叫做Portal,请注意。』
(2) Portlet Container。『Portlet Container用来管理Portlet的生命周期并且提供其运行所需要的必要环境. 并且为Portlet Preferences提供持久性(Persistent)存取服务.但是其不支持内容的Aggregation. Aggregation由Portal组件提供.』
(3) Portlet。『Portlet 是以 Java 技术为技术的 web 组件,可以被容器管理,可以产生动态内容。处理请求并动态返回页面, 可以做为Portal 的可拔插的用户界面组件.』
我们需要Portal的目的就是要做到系统功能与模块的可配置。同时要开源并符合标准。能与其他的系统进行结合比如Struts。
基于这个目标,我们来寻找可用的Portal。
说Portal,就不能不提JSR#168 Portlet。
JSR 是由 JCP ( www.jcp.org ) 这个 Java 组织所定义出来的规范。JSR#168规范就是一个关于Portlet的规范 ——Portlet Spec 1.0 。这个规范推出于去年的10月底。既然有了规范,理所当然的之后的产品就应该按照这个规范来制作。
目前比较主流的Portal产品:
Apache Jetspeed(http://jakarta.apache.org/jetspeed/)
Liferay(http://www.liferay.com)
EXOportal(http://cvs.sf.net/viewcvs.py/exo/ExoPortal/)
Pluto(http://jakarta.apache.org/pluto)
BEA WebLogic Portal (http://edocs.bea.com/wlp/docs81/javadoc/com/bea/portal/model/Portlet.html )
IBM Websphere Portal (http://www.software.ibm.com/wsdd/zones/portal/ )
Oracle Portal Developer Kit (http://portalstudio.oracle.com/)
jfoxportal(http://www.huihoo.org/jfox/jfoxportal/index.html 刚提出草案,不过是国内的。)
Jetspeed是Apache的一个开源项目,现在的最高版本是1.4。WebSphere的Portal就是基于这个系统开发的,但显然二次修改的力度很大。也是应用相对比较多的系统。
但问题是,Jetspeed1.x开发时,标准并没有出台,于是Jetspeed里有很多自己定义的规范,而这些规范显然是应该被废除的。于是这个项目在1.4之后就停止了开发,转而开发支持JSR#168标准的2.0版本。但这个版本的出台目前还遥遥无期。
Apache在JSR#168推出以后,又有了一个新的Portal项目,便是Pluto。Pluto 一个Open Source项目, 是基于Portlet Specs的一个 Portlet Container 的实现. 它也提供了Sample Portal实现.但是功能相对简单。目前开发中。据说从CVS树上下载的版本已经有了安装程序,运行还算正常。但从官方网站来看,还没有推出Alpha 版的征兆。倒是Eclipse好像有了Pluto的插件。有文章专门强调:“请记住Pluto只是一个Portlet Container的实现, 不是一个Portal的实现. 如果你需要功能更为强大的Portal,可以使用JetSpeed , 它同样也是Apache的一个Open Source Project. ”有人预言Jetspeed2.0就会基于Pluto来研发。
Liferay 代表了完整的J2EE应用,使用了Web、EJB以及JMS等技术,特别是其前台界面部分使用Struts 框架技术,基于XML的portlet配置文件可以自由地动态扩展,使用了Web Services来支持一些远程信息的获取,使用 Apahce Lucene实现全文检索功能。 但Liferay的缺点是它缺乏一个简单清晰可拓展的架构设计,portlet设计显得比较凌乱,进行二次开发有一定的难度。这一点我觉得是个比较致命的 弱点,但是有多严重?没有开发,没有发言权。而且这个Based on Jboss。
EXOportal同样Based on Jboss。国内谈论的很少。居然没有找到他们的官方网站,只有一个CVS树。
剩下的,都是商业软件了。
个人觉得BEA WebLogic Portal是做的最好的。我们为什么不能在这上面开发,然后客户有需求的时候直接说服客户让他们买一套Weblogic Portal8.1呢? 哈哈,还可以赚个软件钱。我觉得对于政府、大型企业等完全可以。
至 于开源的选择,我个人倾向于Pluto,但Pluto和Struts的整合到底可以到一个什么程度,不好说。Pluto里头部署就是用Portlet了。 Jetspeed1.4本身与Struts的兼容是有问题的,“因为二者都是前端控制器模式,每个请求最开始都被映射到一个servlet,你如果要让门 户管理起struts应用,那jetspeed的映射应该在最前面,在之后的话你又要想办法把jetspeed中的请求转换到struts,这可能有很多 障碍。 ”