DWR(Direct Web Remoting)是一个开源的类库,可以帮助开发人员开发包含AJAX技术的网站.它可以允许在浏览器里的代码使用运行在WEB服务器上的JAVA函数,就像它就在浏览器里一样.

它包含两个主要的部分:允许JavaScript从WEB服务器上一个遵循了AJAX原则的Servlet(小应用程序)中获取数据.另外一方面一个JavaScript库可以帮助网站开发人员轻松地利用获取的数据来动态改变网页的内容.

DWR采取了一个类似AJAX的新方法来动态生成基于JAVA类的JavaScript代码.这样WEB开发人员就可以在JavaScript里使用Java代码就像它们是浏览器的本地代码(客户端代码)一样;但是Java代码运行在WEB服务器端而且可以自由访问WEB 服务器的资源.出于安全的理由,WEB开发者必须适当地配置哪些Java类可以安全的被外部使用.

这个从JAVA到JavaScript的远程功能方法给DWR的用户带来非常像传统的RPC机制,就像RMI或者SOAP一样,而且拥有运行在WEB上但是不需要浏览器插件的好处.

DWR不认为浏览器/WEB服务器协议是重要的,而更乐于保证编程界面的简单自然.对此最大的挑战就是把AJAX的异步特性和正常JAVA方法调用的同步特性相结合.在异步模式下,结果数据在开始调用之后的一段时间之后才可以被异步访问获取到.DWR允许WEB开发人员传递一个回调函数,来异步处理Java函数调用过程.

其配置如下:
1.1、dwr.xml的配置
<dwr>
<allow>
<create creator="new" javascript="testClass" >

<include method="testMethod1"/>
</create>
</allow>
</dwr>
<allow>标签中包括可以暴露给javascript访问的东西。
<create>标签中指定javascript中可以访问的java类,并定义DWR应当如何获得要进行远程的类的实例。creator="new"属性指定java类实例的生成方式,new意味着DWR应当调用类的默认构造函数来获得实例,其他的还有spring方式,通过与IOC容器Spring进行集成来获得实例等等。javascript=" testClass "属性指定javascript代码访问对象时使用的名称。
标签指定要公开给javascript的java类名。
<include>标签指定要公开给javascript的方法。不指定的话就公开所有方法。
<exclude>标签指定要防止被访问的方法。
1.2、javascript中调用
首先,引入javascript脚本
<script src='dwr/interface/ testClass.js'></script>
<script src='dwr/engine.js'></script>
<script src='dwr/util.js'></script>
其中TestClass.js是dwr根据配置文件自动生成的,engine.js和util.js是dwr自带的脚本文件。
其次,编写调用java方法的javascript函数
Function callTestMethod1(){
testClass.testMethod1();
}
2、调用有简单返回值的java方法
2.1、dwr.xml的配置
配置同1.1
<dwr>
<allow>
<create creator="new" javascript="testClass" >

<include method="testMethod2"/>
</create>
</allow>
</dwr>
2.2、javascript中调用
首先,引入javascript脚本
其次,编写调用java方法的javascript函数和接收返回值的回调函数
Function callTestMethod2(){
testClass.testMethod2(callBackFortestMethod2);
}
Function callBackFortestMethod2(data){
//其中date接收方法的返回值
//可以在这里对返回值进行处理和显示等等
alert("the return value is " + data);
}
其中callBackFortestMethod2是接收返回值的回调函数
3、调用有简单参数的java方法
3.1、dwr.xml的配置
配置同1.1
<dwr>
<allow>
<create creator="new" javascript="testClass" >

<include method="testMethod3"/>
</create>
</allow>
</dwr>
3.2、javascript中调用
首先,引入javascript脚本
其次,编写调用java方法的javascript函数
Function callTestMethod3(){
//定义要传到java方法中的参数
var data;
//构造参数
data = “test String”;
testClass.testMethod3(data);
}
4、调用返回JavaBean的java方法
4.1、dwr.xml的配置
<dwr>
<allow>
<create creator="new" javascript="testClass" >

<include method="testMethod4"/>
</create>
<convert converter="bean" match=""com.dwr.TestBean">

</convert>
</allow>
</dwr>
<creator>标签负责公开用于Web远程的类和类的方法,<convertor>标签则负责这些方法的参数和返回类型。convert元素的作用是告诉DWR在服务器端Java 对象表示和序列化的JavaScript之间如何转换数据类型。DWR自动地在Java和JavaScript表示之间调整简单数据类型。这些类型包括Java原生类型和它们各自的封装类表示,还有String、Date、数组和集合类型。DWR也能把JavaBean转换成JavaScript 表示,但是出于安全性的原因,要求显式的配置,<convertor>标签就是完成此功能的。converter="bean"属性指定转换的方式采用JavaBean命名规范,match=""com.dwr.TestBean"属性指定要转换的javabean名称,标签指定要转换的JavaBean属性。
4.2、javascript中调用
首先,引入javascript脚本
其次,编写调用java方法的javascript函数和接收返回值的回调函数
Function callTestMethod4(){
testClass.testMethod4(callBackFortestMethod4);
}
Function callBackFortestMethod4(data){
//其中date接收方法的返回值
//对于JavaBean返回值,有两种方式处理
//不知道属性名称时,使用如下方法
for(var property in data){
alert("property:"+property);
alert(property+":"+data[property]);
}
//知道属性名称时,使用如下方法
alert(data.username);
alert(data.password);
}
其中callBackFortestMethod4是接收返回值的回调函数
5、调用有JavaBean参数的java方法
5.1、dwr.xml的配置
配置同4.1
<dwr>
<allow>
<create creator="new" javascript="testClass" >

<include method="testMethod5"/>
</create>
<convert converter="bean" match="com.dwr.TestBean">

</convert>
</allow>
</dwr>
5.2、javascript中调用
首先,引入javascript脚本
其次,编写调用java方法的javascript函数
Function callTestMethod5(){
//定义要传到java方法中的参数
var data;
//构造参数,date实际上是一个object
data = { username:"user", password:"password" }
testClass.testMethod5(data);
}
6、调用返回List、Set或者Map的java方法
6.1、dwr.xml的配置
配置同4.1
<dwr>
<allow>
<create creator="new" javascript="testClass" >

<include method="testMethod6"/>
</create>
<convert converter="bean" match="com.dwr.TestBean">

</convert>
</allow>
</dwr>
注意:如果List、Set或者Map中的元素均为简单类型(包括其封装类)或String、Date、数组和集合类型,则不需要<convert>标签。
6.2、javascript中调用(以返回List为例,List的元素为TestBean)
首先,引入javascript脚本
其次,编写调用java方法的javascript函数和接收返回值的回调函数
Function callTestMethod6(){
testClass.testMethod6(callBackFortestMethod6);
}
Function callBackFortestMethod6(data){
//其中date接收方法的返回值
//对于JavaBean返回值,有两种方式处理
//不知道属性名称时,使用如下方法
for(var i=0;i<data.length;i++){
for(var property in data){
alert("property:"+property);
alert(property+":"+data[property]);
}
}
//知道属性名称时,使用如下方法
for(var i=0;i<data.length;i++){
alert(data.username);
alert(data.password);
}
}
7、调用有List、Set或者Map参数的java方法
7.1、dwr.xml的配置
<dwr>
<allow>
<create creator="new" javascript="testClass" >

<include method="testMethod7"/>
</create>
<convert converter="bean" match="com.dwr.TestBean">

</convert>
</allow>
<signatures>
<![CDATA[
import java.util.List;
import com.dwr.TestClass;
import com.dwr.TestBean;
TestClass.testMethod7(List<TestBean>);
]]>
</signatures>
</dwr>
<signatures>标签是用来声明java方法中List、Set或者Map参数所包含的确切类,以便java代码作出判断。
7.2、javascript中调用(以返回List为例,List的元素为TestBean)
首先,引入javascript脚本
其次,编写调用java方法的javascript函数
Function callTestMethod7(){
//定义要传到java方法中的参数
var data;
//构造参数,date实际上是一个object数组,即数组的每个元素均为object
data = [
{
username:"user1",
password:"password2"
},
{
username:"user2",
password:" password2"
}
];
testClass.testMethod7(data);
}
注意:
1、对于第6种情况,如果java方法的返回值为Map,则在接收该返回值的javascript回调函数中如下处理:
function callBackFortestMethod(data){
//其中date接收方法的返回值
for(var property in data){
var bean = data[property];
alert(bean.username);
alert(bean.password);
}
}
2、对于第7种情况,如果java的方法的参数为Map(假设其key为String,value为TestBean),则在调用该方法的javascript函数中用如下方法构造要传递的参数:
function callTestMethod (){
//定义要传到java方法中的参数
var data;
//构造参数,date实际上是一个object,其属性名为Map的key,属性值为Map的value
data = {
"key1":{
username:"user1",
password:"password2"
},
"key2":{
username:"user2",
password:" password2"
}
};
testClass.testMethod(data);
}
并且在dwr.xml中增加如下的配置段
<signatures>
<![CDATA[
import java.util.List;
import com.dwr.TestClass;
import com.dwr.TestBean;
TestClass.testMethod7(Map<String,TestBean>);
]]>
</signatures>
3、由以上可以发现,对于java方法的返回值为List(Set)的情况,DWR将其转化为Object数组,传递个javascript;对于java方法的返回值为Map的情况,DWR将其转化为一个Object,其中Object的属性为原Map的key值,属性值为原Map相应的value值。
4、如果java方法的参数为List(Set)和Map的情况,javascript中也要根据3种所说,构造相应的javascript数据来传递到java中

1. 安装 DWR JAR 包
下载 dwr.jar 文件,然后将它放在 web 程序的 WEB-INF/lib 目录下面,很可能在这个目录下已经有一些 jar 文件了。
2. 编辑 config 文件
将下面的代码添加到 WEB-INF/web.xml 文件中,<servlet>需要放在另外的<servlet>之后,<servlet-mapping>也是如此。
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<display-name>DWR Servlet</display-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
<init-param>
     debug</param-name>
     true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
接下来创建 dwr.xml 文件并将此放在 web.xml 所在的 WEB-INF 目录下。文件中类似下面的内容:
<!DOCTYPE dwr PUBLIC
    ”-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN”
    ”http://www.getahead.ltd.uk/dwr/dwr10.dtd”>
<dwr>
<allow>
    <create creator=”new” javascript=”JDate”>
     
    </create>
    <create creator=”new” javascript=”Demo”>
     
    </create>
</allow>
</dwr>
DWR 配置文件定义了由 DWR 创建和被 Javascript 远程使用的类。在上面的例子中我们在远程创建了2个类,并且给出了在 Javascript 中的类名。
上面使用的 new creator 使用了所有的 JavaBeans 必须含有的公有(public)无参(no-args)的构造函数。值得一提的是, DWR 还有一些限制:
避免使用 JavaScript 保留字;以保留字命名的方法将自动被排除。大多数 JavaScript 的保留字同时也是 Java 的保留字,因此无论如何你也不能使用一个名为 “try()” 的方法。但是最常用的一个词 “delete()”,在 JavaScript 中有特殊的含义而在 Java 中没有。
重载方法(Overloaded methods)将会在调用的时候陷入未知的状况,因此应该避免重载方法。
3. 访问下面的地址
http://localhost:8080/[YOUR-WEBAPP]/dwr/
你应该会看到一个页面,上面显示了刚才你在第二步所创建的类。进入一个链接之后你会看到所有等待调用方法的列表。这些动态产生的例子你也能通过 DWR 来实现。
亲自尝试和体会下吧。
怎样应用到你的 Web 程序中?
在侧边栏有很多例子演示了怎样改变网页中的文本、更新列表、操作表单和动态修改表格。每一个例子都有详细的说明。
另外一个开始方法就是从页面中查看源代码,这些页面你刚刚浏览过:
进入 http://localhost:8080/[YOUR-WEBAPP]/dwr/ 然后点击你创建的类;
查看源代码然后定位到你所感兴趣的方法的代码行;
将这些文本粘贴到你 Web 程序的一个 HTML 或 JSP页面中;
包含下面的 javascrip 文件:
<script src=’/[YOUR-WEBAPP]/dwr/interface/[YOUR-SCRIPT].js’></script>
<script src=’/[YOUR-WEBAPP]/dwr/engine.js’></script>
你可以根据实际情况修改 /[YOUR-WEBAPP]/ 部分。
关于怎样书写 DWR 控制的 Javascript 代码请查看 脚本简介。

官方网站:http://getahead.org/dwr

posted @ 2008-09-17 12:45 小马歌 阅读(205) | 评论 (0)编辑 收藏
 

 [摘抄自:http://blog.soufun.com/12766773/2394732/articledetail.htm]
    奥运已经正离我们远去伦敦的路上,潮水终于退去,使我们有机会看到真正裸泳的人。

好不容易熬到“金九银十”,在美国政府出手收购“两房”之际,一篇洋洋洒洒的《万科松山湖会议发言纪要》在国内网上疯传,市场俨然有着“山雨欲来风满楼”的乌云遮盖,令期待年底回暖与图谋“抄底”的人再次觉得前景渺茫。

 一地鸡毛

越来越多的人已经感觉到冬天的降临。有人指出:房价的下跌根本原因不是政府调控,也不是刚需减少,而是房子失去了投资价值。当盛宴变成“剩宴”的时候,只能是盘倾碗覆,一片狼藉。

而深圳楼市的居住价值越来越多的人扪心自问:这是我们生活中必须要为之付出一辈子辛劳的安乐窝吗?

从谁都知道房子要涨价,炒房客蜂拥而入,开发商惜售捂盘,雇人排队,分期开发,疯狂拿地,可怜的刚需人群,在这股洪流的胁裹之下,不得不忐忑不安又兴奋而激动的成为房奴,为自己家的房子升值而高兴,但却又感觉好像和自己没什么关系。

观望、抛售情绪浓厚,不是没钱买,怕买楼被套、怕受伤,这乃当今深圳楼市一大景象。

准备过冬

学者认为:在三十年的中国变革历程中,宏观调控(在1992年之前称为治理整顿)是一个定期出现的名词。自1978年开始改革以来,1981年就发生了经济动荡和政策紧缩,其后,每隔四到五年就会呈现类似的“过冬景象”,这些年份分别是:1984年、1989年、1993年、1998年、2004——其间,惟一的一次输入式行业危机是2000年的互联网泡沫破灭,不过,它对整体宏观经济的影响不大——按此规律,2008年的“冬天”似乎是如期而止。对这一周期规律的警觉与漠视,是企业成败的关键所在。
     所有的宏观调控都是因为经济的超速成长所导致的。在一个狂热成长的年份之后,接踵而至的就是一个骤然降温的严酷冬天,紧缩政策的出台往往是紧刹车式的,其间几乎没有任何过渡。这使得那些激进发展的企业因为缺乏风险防范而导致窒息式的崩塌。在这次宏观调控中,陷入困境的主要是两类企业:一类是在前两年投入大量资金用于技术改造和规模扩张,一类是贸然进入了房地产等“暴利行业”,冬天骤至,顿时爆发资金危机。

 市场不必跟着万科走

昨天与一家老牌资质开发商老总餐聚,席间他对当前楼市感叹许多。“在这轮调整中,深圳下跌最早,跌得最深,必然也在未来起来最早。”但现在二线城市的调整浪也刚刚展开,站起来的时间可能要大大推迟。

“部分媒体惟恐天下不乱,开发商与媒体不是水火不相容的关系,开发商倒了,对媒体行业也没有好处。报道出发点能否客观些,楼市兴衰媒体也有一定责任。前段时间传出部分开发商密谋开会团结一致放出风声:如果媒体不调整”唱空“基调”的话,开发商也将被迫联合起来自卫。” 《万科松山湖会议发言纪要》的降价预言使万科十分尴尬,又使部分媒体“空军”力量注入新鲜血液。

现在看来,所谓《万科松山湖会议发言纪要》真假难辩,万科楼盘除了只会降价之外难道就毫无其他妙方了吗?

“今年以来,万科对这波楼市调整的品牌影响力甚大,但万科在全国的市场占有率才不过5%,在许多城市拿到的都是边缘化的地块,主流城区的定价权并不在万科手里,在深圳、上海、广州、北京、天津均是如此,为什么万科一降价全国就跟“疯”?这与中国房地产行业发展的不平衡不无关系。”

在东莞,万科进入这座城市才不过四年,但是东莞地产的主流定价权已经被万科牢牢掌握。接二连三的降价潮已经将这座城市的投资客与自住客推向了风口浪尖,本土开发商很受伤。但诸如光大、新世纪、富盈等掌握本土优质地块的开发商对万科这个“外来和尚”是又恨又无奈。

“万科在东莞并没有降价清理门户的资格。相对于本土巨头而言,万科的拿地成本比几乎是零地价成本的本土企业毫无优势,就算降价也是本土企业先降。所以万科降价出货难免过于主观臆断,并有可能误伤到自己。”一位东莞本土地产商告诉笔者。拿松山湖为例,光大锦绣山河项目几千亩开发面积都没有急于出货,面对对手万科的频频发难,光大戏言“所开发项目根本不在一个水平上,不与之玩了”,并称旗下楼盘退出3月以来在东莞兴起的价格战游戏。

当股市、楼市失去投资价值的时候,当市场剩下刚性需求的时候,可怜的刚需有能支撑多久呢?当去年在淘金楼市中冒起来的成千上万的百万富翁、千万富翁有的已经成为“负翁”时,这场“千金散去”的数字游戏胜过哈佛教科书将令那些没有经历过90年代泡沫地产的人们记忆犹新。现在看来,推倒重来也许是最好的“救市”方法。

“活着真好。”这位开发商老总庆幸自己楼盘去年没有全国圈地,他认为深圳的开发商应珍惜活着的机会,开发出好产品献给这座充满活力的城市。

 “冬天过去,必有春天,经过冬天的人会更成熟起来,潮来潮去,天下没有不散的宴席,塞翁失马,焉知祸福?宴席散去,后会有期,祈祷深圳楼市一路走好。

posted @ 2008-09-17 09:54 小马歌 阅读(150) | 评论 (0)编辑 收藏
 

最初的xml解析器是sun的Crimson和IBM的Xerces,这两个开源项目都捐给了apache组织,后来Xerces发展很快,Crimon基本没有人使用。
1.4 版本起,用于 XML 处理的 Java API 就已经加入了Java 2 平台中。 利用该 API,可通过一系列标准的 Java 平台 API 来处理 XML 文档。
 因此,也就无需另外添加 XML 处理包了。sun的JDK1.4使用Crimson,IBM的JDK使用Xerces。
如果打算把sun 的jdk程序移植到IBM的JDK下,注意解析器不同,XML处理会出问题。这就说明了java不是“一次编译,到处运行”,而是“一次编译,到处调试”。
如果你把IBM的JDK移植到SUN的JDK下,即使把Xerces包引入CLASSPATH,JDK还是使用Crimson,不信你运行java -verbose试一试。
解决的办法就是在在JRE\lib\目录下,建立一个jaxp.properties的文件,
内容如下:
    javax.xml.parsers.DocumentBuilderFactory=org.apache.xerces.jaxp.DocumentBuilderFactoryImpl
    javax.xml.parsers.SAXParserFactory=org.apache.xerces.jaxp.SAXParserFactoryImpl
就可以使用Xerces。
或者使用命令行
# Add the XML parser jars and set the JAXP factory names
# Crimson parser JAXP setup(default)
CLASSPATH=$CLASSPATH:../lib/crimson.jar
JAXP=-Djavax.xml.parsers.DocumentBuilderFactory=org.apache.crimson.jaxp.DocumentBuilderFactoryImpl
JAXP="$JAXP -Djavax.xml.parsers.SAXParserFactory=org.apache.crimson.jaxp.SAXParserFactoryImpl"

# Add the XML parser jars and set the JAXP factory names
# Xerces parser JAXP setup
CLASSPATH=$CLASSPATH:../lib/xerces.jar
JAXP=-Djavax.xml.parsers.DocumentBuilderFactory=org.apache.xerces.jaxp.DocumentBuilderFactoryImpl
JAXP="$JAXP -Djavax.xml.parsers.SAXParserFactory=org.apache.xerces.jaxp.SAXParserFactoryImpl"
最终sun还是指定JAXP规范,JSR 206 Java API for XML Processing(JAXP) 1.3,他已经由JDK1.5实现。
JAXP实现了XPath,但是xalan的org.apache.xpath.XPathAPI 类已经移植到了 JRE 1.5 中,重构为com.sun.org.apache.xpath.internal.XPathAPI。 
如果在以前的JDK中,使用含 XPathAPI 类的 jar,例如 xalan-2.4.1.jar。 将该 jar 加入到 CLASSPATH(类路径)。

W3C的DOM标准API非常难用,于是有人开发 Java专用的XML API,这就是jdom=java+DOM。其中一部分人,去开发dom4j,这个不是非常标准,但是速度很快。
使用JDOM隐含服务器风险,因为JBoss和Webphere都是基于JDOM开发的,在这两个服务器下使用JDOM,必须进行相应的设置,而且你的JDOM版本必须与服务器使用的相近,
因为JVM只加载一份相同的类,服务器优先加载自己使用的JDOM,你开发用的JDOM不会被加载,你的应用就会出错。
使用Dom4J隐含工程问题,主要是hibernate,如果你开发的项目和hibernate合并,Dom4J版本不兼容的话,寻找dom4j相同版本hibernate,或者你改程序适应hibernate的Dom4j。
java没有windows的DLL地狱,但是java的jar地狱有过而无不及啊。

posted @ 2008-09-12 11:06 小马歌 阅读(472) | 评论 (0)编辑 收藏
 

sun和ibm都有一套xml的实现,sun的实现是打到jdk里面了。
但当加载的时候,如果ibm的实现jar包xercesImpl.jar的接口 xml-apis.jar [j2ee1.4 library 有]文件导入到classpath 里了的话:
1 如果xml-apis.jar先于 jre加载,那么 将采用 xercesImpl.jar的实现;
2 如果jre先加载,那么将用 sun的xml实现,而取这个实现的类又分别按顺序从4个位置取.

  • 使用 javax.xml.parsers.DocumentBuilderFactory 系统属性。
  • 使用 JRE 文件夹中的属性文件 "lib/jaxp.properties"。此配置文件格式为标准的 java.util.Properties 且包含实现类的完全限定名,其中实现类的键是上述定义的系统属性。 JAXP 实现只读取一次 jaxp.properties 文件,然后缓存其值供以后使用。如果首次尝试读取文件时,文件不存在,则不会再次尝试检查该文件是否存在。首次读取 jaxp.properties 后,其中的属性值不能再更改。
  • 如果可以,使用 Services API(在 JAR 规范中进行了详细描述)来确定类名称。Services API 将查找在运行时可用的 jar 中 META-INF/services/javax.xml.parsers.DocumentBuilderFactory 文件中的类名。
  • 平台默认的 DocumentBuilderFactory 实例。

这些过程,自己可以通过加vm参数 "-verbose"的方式进行跟踪

posted @ 2008-09-12 10:40 小马歌 阅读(2175) | 评论 (0)编辑 收藏
 

最近部署一个JAVA程序到Linux中的crontab,遇到了乱码。因为以前一直都用英文信息,所以一直没遇到这个问题。原来还是环境变量的问题,因为在crontab系统里不会携带用户的环境参数。因此,需要额外添加。不过有点奇怪的是其中一些变量,不需要显式export出来就可以了,比如PATH,JAVA_HOME之类的,而LANG参数则需要显式export才可以,否则,就是好多问号,乱码....


crontab所引用的sync.cron
#!/bin/bash
CPATH=
WEBLIB="/usr/local/apache-tomcat-5.5.20/webapps/banner/WEB-INF/lib"
WEBCLASSPATH="/usr/local/apache-tomcat-5.5.20/webapps/banner/WEB-INF/classes"
for i in "$WEBLIB"/*.jar;do
   CPATH="$CPATH":"$i"
done
CPATH="$WEBCLASSPATH":"$CPATH"

export LANG="zh_CN.GB18030"
/usr/local/jdk1.5.0/bin/java -cp $CPATH com.sandai.project.service.MailService


执行java程序的java命令,也要全路径,否则也找不到该命令。
posted @ 2008-09-12 09:51 小马歌 阅读(516) | 评论 (0)编辑 收藏
 
试用rtx2007:
1,rtx目前只支持windows平台;
2,二次开发支持很多语言,通过rtx server SDK实现,跨平台发提醒通过http cgi服务实现;
3,rtx client 支持web方式实现在线感知以及发起交谈,发送文件等操作。

/Files/xiaomage234/rtx-WEB-tool.rar

/Files/xiaomage234/rtx_sdk_help.rar
posted @ 2008-09-10 15:56 小马歌 阅读(666) | 评论 (0)编辑 收藏
 

系统收到邮件都会保存在“/var/spool/mail/[linux用户名]”文件中。
在linux中输入mail,就进行了收件箱,并显示二十封邮件列表。

此时命令提示符为"&"
unread 标记为未读邮件
h|headers 显示当前的邮件列表
l|list 显示当前支持的命令列表
?|help 显示多个查看邮件列表的命令参数用法
d 删除当前邮件,指针并下移。 d 1-100 删除第1到100封邮件
f|from 只显示当前邮件的简易信息。 f num 显示某一个邮件的简易信息
f|from num 指针移动到某一封邮件
z 显示刚进行收件箱时的后面二十封邮件列表
more|p|page 阅读当前指针所在的邮件内容 阅读时,按空格键就是翻页,按回车键就是下移一行
t|type|more|p|page num 阅读某一封邮件
n|next|{什么都不填} 阅读当前指针所在的下一封邮件内容
     阅读时,按空格键就是翻页,按回车键就是下移一行
v|visual 当前邮件进入纯文本编辑模式
n|next|{什么都不填} num 阅读某一封邮件
top 显示当前指针所在的邮件的邮件头
file|folder 显示系统邮件所在的文件,以及邮件总数等信息
x 退出mail命令平台,并不保存之前的操作,比如删除邮件
q 退出mail命令平台,保存之前的操作,比如删除已用d删除的邮件,已阅读邮件会转存到当前用户家目录下的mbox文件中。如果在mbox中删除文件才会彻底删除。
在linux文本命令平台输入 mail -f mbox,就可以看到当前目录下的mbox中的邮件了。
cd 改变当前所在文件夹的位置
写信时,连按两次Ctrl+C键则中断工作,不送此信件。
读信时,按一次Ctrl+C,退出阅读状态。
--------------------------------------
Linux邮件命令用法

1. 将文件当做电子邮件的内容送出
语法:mail -s “主题”用户名@地址< 文件
例如:
mail -s “program” user < file.c 将file.c

当做mail的内容,送至user,主题为program。

2. 传送电子邮件给本系统用户
语法:mail 用户名

3. 传送电子邮件至外地用户
语法: mail 用户名@接受地址
.../usr/lib/sendmail -bp
......“Mail queue is empty” ......mail ....

例如:

test@hotmail.com
Subject : mail test
:
键入信文内容
: :
按下Ctrl+D 键或. 键结束正文。
连按两次Ctrl+C键则中断工作,不送此信件。
Cc( Carbon copy) : 复制一份正文,给其他的收信人。

4. 检查所传送的电子邮件是否送出,或滞留在邮件服务器中
语法:/usr/lib/sendmail -bp
若屏幕显示为“Mail queue is empty” 的信息,表示mail 已送出。
若为其他错误信息,表示电子邮件因故尚未送出。

posted @ 2008-09-03 13:09 小马歌 阅读(696) | 评论 (0)编辑 收藏
 
【Lighttpd 安装配置】

首先需要安装:
libpcre
libz

官方网址:http://www.lighttpd.net
# cd /usr/local/src
# wget http://www.lighttpd.net/download/lighttpd-1.4.18.tar.gz
# tar -zxvf lighttpd-1.4.18.tar.gz
# cd lighttpd-1.4.18

# ./configure --prefix=/usr/local/lighttpd
# make
# make install

# cd /usr/local/lighttpd
# mkdir conf
# cp /usr/local/src/lighttpd-1.4.18/doc/lighttpd.conf /usr/local/lighttpd/conf/
# vi /usr/local/lighttpd/conf/lighttpd.conf
===============================================
server.modules = (
"mod_rewrite",
"mod_redirect",
"mod_alias",
"mod_access",
# "mod_cml",
# "mod_trigger_b4_dl",
# "mod_auth",
# "mod_status",
# "mod_setenv",
# "mod_fastcgi",
# "mod_proxy",
"mod_simple_vhost",
# "mod_evhost",
# "mod_userdir",
# "mod_cgi",
"mod_compress",
"mod_ssi",
# "mod_usertrack",
"mod_expire",
# "mod_secdownload",
# "mod_rrdtool",
"mod_accesslog" )

mimetype.assign = (
...
".rm" => "audio/x-pn-realaudio",
...
".smi" => "application/smil",
".smil" => "application/smil",
...
)

ssi.extension = ( ".shtml" )


accesslog.filename = "/dev/null"
accesslog.format = "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\""

$HTTP["host"] == "home.cn.real.com" {
accesslog.filename = "/real/WebSite/logs/backup/access_log.home"
}


$HTTP["url"] =~ "\.js|\.css|\.jpg|\.gif|\.swf|\/artistinfo\/|\/status\/|\.png|\.ico|\/player\/|\/radio\/sid\/" {
accesslog.filename = "/dev/null"
}

dir-listing.activate = "disable"

server.document-root = "/real/WebSite/htdocs/home.cn.real.com/"
server.errorlog = "/usr/local/lighttpd/log/error.log"
index-file.names = ( "index.html", "index.htm")
server.pid-file = "/usr/local/lighttpd/log/lighttpd.pid"

simple-vhost.server-root = "/real/WebSite/htdocs/"
simple-vhost.default-host = "home.cn.real.com"
simple-vhost.document-root = "/"

compress.cache-dir = "/real/WebSite/cache/compress/"
compress.filetype = ("text/plain", "text/html")



#Performance
server.max-keep-alive-requests = 2000
server.max-keep-alive-idle = 10
server.max-read-idle = 60
server.max-write-idle = 360
server.event-handler = "poll"
server.max-fds = 2048



===============================================

# cp /usr/local/src/lighttpd-1.4.18/doc/rc.lighttpd.redhat /usr/local/lighttpd/bin/lighttpd.sh
# vi /usr/local/lighttpd/bin/lighttpd.sh
===============================================

LIGHTTPD_CONF_PATH="/usr/local/lighttpd/conf/lighttpd.conf"

lighttpd="/usr/local/lighttpd/sbin/lighttpd"

===============================================



启动lighttpd 服务器
# /usr/local/lighttpd/bin/lighttpd.sh start
(或者使用 # /usr/local/lighttpd/sbin/lighttpd -f /usr/local/lighttpd/conf/lighttpd.conf )




Installing services ?
Lighttpd is meant to run a in background as daemon. You can either use the well known init-scripts or supervise to control it.

init scripts ?
The init-script that is shipped with the source-tarball is meant to be run on a LSB conforming platform like SuSE, Fedora or Debian.

$ sed -e 's/FOO/lighttpd/g' doc/rc.lighttpd > /etc/init.d/lighttpd
$ chmod a+rx /etc/init.d/lighttpd
$ cp -p doc/sysconfig.lighttpd /etc/sysconfig/lighttpd
$ install -Dp ./doc/lighttpd.conf /etc/lighttpd/lighttpd.conf
$ chkconfig lighttpd on
If you're running CentOS (or RHEL) you might need to change the first line to this

$ sed -e 's/FOO/lighttpd/g' doc/rc.lighttpd.redhat > /etc/init.d/lighttpd
In Debian\Ubuntu you use update-rc.d rather than chkconfig:

$ sudo update-rc.d lighttpd defaults




【安装php (fast-cgi)】
安装 mysql
安装 libxml2-2.6.30.tar.gz

./configure \
--prefix=/usr/local/php5-fcgi \
--with-config-file-path=/etc \
--with-mysql=/usr/local/mysql \
--with-gd \
--with-jpeg-dir \
--with-zlib-dir \
--with-png-dir \
--with-freetype-dir \
--with-curl \
--with-libxml-dir=/usr/local \
--enable-fastcgi \
--enable-force-cgi-redirect \
--enable-soap \
--enable-sockets \
--enable-ftp \
--disable-debug

# vi /etc/php.ini
===============================================
cgi.fix_pathinfo=1
===============================================

spawn-php.sh 是把 PHP with FastCGI 的环境变量初始化 (还不清楚如何使用,先不启动spawn-php.sh)
# cp /usr/local/src/lighttpd-1.4.18/doc/spawn-php.sh /usr/local/lighttpd/bin/

# vi /usr/local/lighttpd/bin/spawn-php.sh

===============================================

SPAWNFCGI="/usr/local/lighttpd/bin/spawn-fcgi"

FCGIPROGRAM="/usr/local/php5-fcgi/bin/php"

USERID=root

GROUPID=root

===============================================

# /usr/local/lighttpd/bin/spawn-php.sh


===============================================
防盗链接配置
===============================================

server.modules = (
...
"mod_secdownload",
"mod_flv_streaming",
...
)

flv-streaming.extensions = (".flv")
secdownload.secret = "2008"
secdownload.document-root = "/real/WebSite/videos/flv/"
secdownload.uri-prefix = "/dl/"
secdownload.timeout = 120


<?php
$secret = "2008";
$uri_prefix = "/dl/";

# filename
$f = "/test.flv";

# current timestamp
$t = time();
$t_hex = sprintf("%08x", $t);

$m = md5($secret.$f.$t_hex);

printf('<a href="%s%s/%s%s">%s</a>',
$uri_prefix, $m, $t_hex, $f, $f);
?>
posted @ 2008-08-29 16:16 小马歌 阅读(512) | 评论 (2)编辑 收藏
 

使用 Nginx 提升网站访问速度2008-08-26 11:27     主要介绍如何在 Linux 系统上安装高性能的 HTTP 服务器 —— Nginx、并在不改变原有网站结构的条件下用 Nginx 来提升网站的访问速度。

Nginx 简介

Nginx("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 Nginx是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,它已经在该站点运行超过两年半了。 Igor 将源代码以类BSD 许可证的形式发布。尽管还是测试版,但是,Nginx 已经因为它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名了。

根据最新一期(08 年 6 月份)的 NetCraft 调查报告显示,已经有超过两百万的主机使用了 Nginx,这个数字超过了另外一个轻量级的 HTTP 服务器 lighttpd, 排名第四,并且发展迅速。下面是这份报告的前几名的报表:

以下为引用的内容:
产品          网站数                    
Apache 84,309,103
IIS 60,987,087
Google GFE 10,465,178
Unknown 4,903,174
nginx 2,125,160
Oversee 1,953,848
lighttpd 1,532,952 


           
关于这期调查报告的更详细信息请看下面链接:

http://survey.netcraft.com/Reports/200806/           
                          

使用 Nginx 前必须了解的事项
           
目前官方 Nginx 并不支持 Windows,您只能在包括 Linux、UNIX、BSD 系统下安装和使用;
Nginx 本身只是一个 HTTP 和反向代理服务器,它无法像 Apache 一样通过安装各种模块来支持不同的页面脚本,例如 PHP、CGI 等;
Nginx 支持简单的负载均衡和容错;
支持作为基本 HTTP 服务器的功能,例如日志、压缩、Byte ranges、Chunked responses、SSL、虚拟主机等等,应有尽有。
            在 Linux 下安装 Nginx
            为了确保能在 Nginx 中使用正则表达式进行更灵活的配置,安装之前需要确定系统是否安装有 PCRE(Perl Compatible Regular Expressions)包。您可以到 ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/ 下载最新的 PCRE 源码包,使用下面命令下载编译和安装 PCRE 包

# wget ftp://ftp.csx.cam.ac.uk/pub/soft ... cre/pcre-7.7.tar.gz
# tar zxvf pcre-7.7.tar.gz
# cd pcre-7.7
# ./configure
# make
# make install
                       

            接下来安装 Nginx,Nginx 一般有两个版本,分别是稳定版和开发版,您可以根据您的目的来选择这两个版本的其中一个,下面是把 Nginx 安装到 /opt/nginx 目录下的详细步骤:
          

# wget http://sysoev.ru/nginx/nginx-0.6.31.tar.gz
# tar zxvf nginx-0.6.31.tar.gz


# cd nginx-0.6.31
# ./configure --with-http_stub_status_module –prefix=/opt/nginx
# make
# make install
                       

            其中参数 --with-http_stub_status_module 是为了启用 nginx 的 NginxStatus 功能,用来监控 Nginx 的当前状态。
            安装成功后 /opt/nginx 目录下有四个子目录分别是:conf、html、logs、sbin 。其中 Nginx 的配置文件存放于conf/nginx.conf,Nginx 只有一个程序文件位于 sbin 目录下的 nginx 文件。确保系统的 80端口没被其他程序占用,运行 sbin/nginx 命令来启动 Nginx,打开浏览器访问此机器的 IP,如果浏览器出现 Welcome tonginx! 则表示 Nginx 已经安装并运行成功。
            常用的 Nginx 参数和控制
            程序运行参数
            Nginx 安装后只有一个程序文件,本身并不提供各种管理程序,它是使用参数和系统信号机制对 Nginx 进程本身进行控制的。 Nginx 的参数包括有如下几个:
                            -c <path_to_config>:使用指定的配置文件而不是 conf 目录下的 nginx.conf 。
                            -t:测试配置文件是否正确,在运行时需要重新加载配置的时候,此命令非常重要,用来检测所修改的配置文件是否有语法错误。
                            -v:显示 nginx 版本号。

-V:显示 nginx 的版本号以及编译环境信息以及编译时的参数。

例如我们要测试某个配置文件是否书写正确,我们可以使用以下命令

sbin/nginx – t – c conf/nginx2.conf

通过信号对 Nginx 进行控制

Nginx 支持下表中的信号:

信号名                                             作用描述                   

TERM, INT 快速关闭程序,中止当前正在处理的请求

QUIT 处理完当前请求后,关闭程序

HUP 重新加载配置,并开启新的工作进程,关闭就的进程,此操作不会中断请求

USR1 重新打开日志文件,用于切换日志,例如每天生成一个新的日志文件

USR2 平滑升级可执行程序

WINCH 从容关闭工作进程

有两种方式来通过这些信号去控制 Nginx,第一是通过 logs 目录下的 nginx.pid 查看当前运行的 Nginx 的进程 ID,通过 kill – XXX <pid> 来控制 Nginx,其中 XXX 就是上表中列出的信号名。如果您的系统中只有一个 Nginx 进程,那您也可以通过 killall 命令来完成,例如运行 killall – s HUP nginx 来让 Nginx 重新加载配置。

配置 Nginx

先来看一个实际的配置文件:

以下为引用的内容:
            user nobody;# 工作进程的属主
worker_processes 4;# 工作进程数,一般与 CPU 核数等同
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;

#pid        logs/nginx.pid;

events {
    use epoll;#Linux 下性能最好的 event 模式
    worker_connections 2048;# 每个工作进程允许最大的同时连接数
}

http {
    include       mime.types;
    default_type application/octet-stream;

    #log_format main '$remote_addr - $remote_user [$time_local] $request '
    #                  '"$status" $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log off;
    access_log logs/access.log;# 日志文件名

    sendfile        on;
    #tcp_nopush     on;
    tcp_nodelay     on;

    keepalive_timeout 65;

    include          gzip.conf;
   
    # 集群中的所有后台服务器的配置信息
    upstream tomcats {
         server 192.168.0.11:8080 weight=10;
         server 192.168.0.11:8081 weight=10;
         server 192.168.0.12:8080 weight=10;
         server 192.168.0.12:8081 weight=10;
         server 192.168.0.13:8080 weight=10;
         server 192.168.0.13:8081 weight=10;
    }

    server {
        listen       80;#HTTP 的端口
        server_name localhost;

        charset utf-8;

        #access_log logs/host.access.log main;

         location ~ ^/NginxStatus/ {
            stub_status on; #Nginx 状态监控配置
            access_log off;
         }

         location ~ ^/(WEB-INF)/ {
            deny all;
         }
      

         location ~ \.(htm|html|asp|php|gif|jpg|jpeg|png|bmp|ico|rar|css|js|
         zip|java|jar|txt|flv|swf|mid|doc|ppt|xls|pdf|txt|mp3|wma)$ {
             root /opt/webapp;
            expires 24h;
        }

        location / {
            proxy_pass http://tomcats;# 反向代理
            include proxy.conf;
        }

        error_page 404 /html/404.html;

        # redirect server error pages to the static page /50x.html
        #
         error_page 502 503 /html/502.html;
        error_page 500 504 /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}
 


Nginx 监控

上面是一个实际网站的配置实例,其中灰色文字为配置说明。上述配置中,首先我们定义了一个 location ~^/NginxStatus/,这样通过 http://localhost/NginxStatus/ 就可以监控到 Nginx的运行信息,显示的内容如下:

以下为引用的内容:
Active connections: 70
server accepts handled requests
14553819 14553819 19239266
Reading: 0 Writing: 3 Waiting: 67 


NginxStatus 显示的内容意思如下:
           
active connections – 当前 Nginx 正处理的活动连接数。

erveraccepts handled requests -- 总共处理了 14553819 个连接 , 成功创建 14553819 次握手 (证明中间没有失败的 ), 总共处理了 19239266 个请求 ( 平均每次握手处理了 1.3 个数据请求 )。

reading -- nginx 读取到客户端的 Header 信息数。

writing -- nginx 返回给客户端的 Header 信息数。

waiting -- 开启 keep-alive 的情况下,这个值等于 active - (reading + writing),意思就是 Nginx 已经处理完正在等候下一次请求指令的驻留连接。

静态文件处理

通过正则表达式,我们可让 Nginx 识别出各种静态文件,例如 images 路径下的所有请求可以写为:

以下为引用的内容:
            location ~ ^/images/ {
    root /opt/webapp/images;
}
                        
            而下面的配置则定义了几种文件类型的请求处理方式。
            location ~ \.(htm|html|gif|jpg|jpeg|png|bmp|ico|css|js|txt)$ {
    root /opt/webapp;
    expires 24h;
}
 


对于例如图片、静态 HTML 文件、js 脚本文件和 css 样式文件等,我们希望 Nginx 直接处理并返回给浏览器,这样可以大大的加快网页浏览时的速度。因此对于这类文件我们需要通过 root 指令来指定文件的存放路径,同时因为这类文件并不常修改,通过 expires 指令来控制其在浏览器的缓存,以减少不必要的请求。 expires 指令可以控制 HTTP 应答中的“ Expires ”和“ Cache-Control ”的头标(起到控制页面缓存的作用)。您可以使用例如以下的格式来书写 Expires:

以下为引用的内容:
expires 1 January, 1970, 00:00:01 GMT;
expires 60s;
expires 30m;
expires 24h;
expires 1d;
expires max;
expires off;


动态页面请求处理

Nginx本身并不支持现在流行的 JSP、ASP、PHP、PERL 等动态页面,但是它可以通过反向代理将请求发送到后端的服务器,例如Tomcat、Apache、IIS 等来完成动态页面的请求处理。前面的配置示例中,我们首先定义了由 Nginx直接处理的一些静态文件请求后,其他所有的请求通过 proxy_pass 指令传送给后端的服务器(在上述例子中是 Tomcat)。最简单的 proxy_pass 用法如下:

以下为引用的内容:
            location / {
    proxy_pass        http://localhost:8080;
    proxy_set_header X-Real-IP $remote_addr;
}


这里我们没有使用到集群,而是将请求直接送到运行在 8080 端口的 Tomcat 服务上来完成类似 JSP 和 Servlet 的请求处理。

当页面的访问量非常大的时候,往往需要多个应用服务器来共同承担动态页面的执行操作,这时我们就需要使用集群的架构。 Nginx 通过 upstream 指令来定义一个服务器的集群,最前面那个完整的例子中我们定义了一个名为 tomcats 的集群,这个集群中包括了三台服务器共 6 个 Tomcat 服务。而 proxy_pass 指令的写法变成了:

以下为引用的内容:
            location / {
    proxy_pass        http://tomcats;
    proxy_set_header X-Real-IP $remote_addr;
}


在 Nginx 的集群配置中,Nginx 使用最简单的平均分配规则给集群中的每个节点分配请求。一旦某个节点失效时,或者重新起效时,Nginx 都会非常及时的处理状态的变化,以保证不会影响到用户的访问。

总结

尽管整个程序包只有五百多 K,但麻雀虽小、五脏俱全。 Nginx官方提供的各种功能模块应有尽有,结合这些模块可以完整各种各样的配置要求,例如:压缩、防盗链、集群、FastCGI、流媒体服务器、Memcached 支持、URL 重写等等,更关键的是 Nginx 拥有 Apache 和其他 HTTP服务器无法比拟的高性能。您甚至可以在不改变原有网站的架构上,通过在前端引入 Nginx 来提升网站的访问速度。
 

posted @ 2008-08-29 15:01 小马歌 阅读(181) | 评论 (0)编辑 收藏
 
cacheModel的属性值等于指定的 cacheModel 元素的 name 属性值。属性 cacheModel 定义查询 mapped statement 的缓存。每一个查询 mapped statement 可以使用不同或相同的cacheModel,以下给出个例子。

<cacheModel id="product-cache" imlementation="LRU"(或 type ="LRU") [readOnly=“true” serialize=“false”]> // [ ] 表示可选
    <flushInterval hours="24"/>
    <flushOnExecute statement="insertProduct"/>
    <flushOnExecute statement="updateProduct"/>
    <flushOnExecute statement="deleteProduct"/>
<property name="size" value="1000" />
</cacheModel>

<statement id="getPoductList" parameerClass="int" cacheModel="product-cache">
    select * from PRODUCT where PRD_CAT_ID = #value#
</statement>

// 使用“近期最少使用”(LRU)实现
// 上面例子中,“getProductList”的缓存每 24 小时刷新一次,或当更新的操作发生时刷新。一个 cacheModel 只能有一个 flushInteval 元素,它可以使用 hours,minutes,seconds或 milliseconds 来设定。某些 cache model 的实现可能需要另外的属性,如上面的“cache-size”属性。在 LRU cache model 中,cache-size指定了缓存储存的项数


缓存类型
Cache Model 使用插件方式来支持不同的缓存算法。它的实现在cacheModel 的用 type 属性来指定(如上所示)。指定的实现类必须实现 CacheController接口,或是下面 4个别名中的其中之一。Cache Model 实现的其他配置参数通过 cacheModel的 property元素来设置。目前包括以下的 4 个实现:

"MEMORY" (com.ibatis.db.sqlmap.cache.memory.MemoryCacheController)
MEMORY cache 实现使用 reference 类型来管理 cache 的行为。垃圾收集器可以根据 reference类型判断是否要回收 cache 中的数据。MEMORY实现适用于没有统一的对象重用模式的应用,或内存不足的应用。

MEMORY实现可以这样配置:

<cacheModel id="product-cache" type="MEMORY">
<flushInterval hours="24"/>
<flushOnExecute statement="insertProduct"/>
<flushOnExecute statement="updateProduct"/>
<flushOnExecute statement="deleteProduct"/>
<property name="reference-type" value="WEAK"/>
</cacheModel>

// MEMORY cache 实现只认识一个<property>元素。这个名为“reference-type”属性的值必须是 STRONG,SOFT 和 WEAK 三者其一。这三个值分别对应于 JVM 不同的内存 reference类型。

"LRU" (com.ibatis.db.sqlmapache.lru.LruCacheController)
LRU Cache 实现用“近期最少使用”原则来确定如何从 Cache 中清除对象。当 Cache 溢出时,最近最少使用的对象将被从 Cache 中清除。使用这种方法,如果一个特定的对象总是被使用,它将保留在 Cache 中,而且被清除的可能性最小。对于在较长的期间内,某些用户经常使用某些特定对象的情况(例如,在 PaginatedList 和常用的查询关键字结果集中翻
页),LRU Cache 是一个不错的选择。

LRU Cache实现可以这样配置:

<cacheModel id="product-cache" type="LRU">
<flushInterval hours="24"/>
<flushOnExecute statement="insertProduct"/>
<flushOnExecute statement="updateProduct"/>
<flushOnExecute statement="deleteProduct"/>
<property name="size" value="1000"/>
</cacheModel>

// LRU Cache实现只认可一个 property元素。其名为“cache-size”的属性值必须是整数,代表同时保存在 Cache中对象的最大数目。值得注意的是,这里指的对象可以是任意的,从单一的 String 对象到 Java Bean 的 ArrayList 对象都可以。因此,不要 Cache太多的对象,以免内存不足。


"FIFO" (com.ibatis.db.sqlmap.cache.fifo.FifoCacheController)
FIFO Cache 实现用“先进先出”原则来确定如何从 Cache 中清除对象。当 Cache 溢出时,最先进入 Cache 的对象将从 Cache 中清除。对于短时间内持续引用特定的查询而后很可能不再使用的情况,FIFO Cache 是很好的选择。

FIFO Cache可以这样配置:

<cacheModel id="product-cache" type="FIFO">
<flushInterval hours="24"/>
<flushOnExecute statement="insertProduct"/>
<flushOnExecute statement="updateProduct"/>
<flushOnExecute statement="deleteProduct"/>
<property name="size" value="1000"/>
</cacheModel>

// property 的 size 同LRU

"OSCACHE" (com.ibatis.db.sqlmap.cache.oscache.OSCacheController)
OSCACHE Cache 实现是OSCache2.0缓存引擎的一个 Plugin。它具有高度的可配置性,
分布式,高度的灵活性。

OSCACHE 实现可以这样配置:
<cacheModel id="product-cache" type="OSCACHE">
<flushInterval hours="24"/>
<flushOnExecute statement="insertProduct"/>
<flushOnExecute statement="updateProduct"/>
<flushOnExecute statement="deleteProduct"/>
</cacheModel>

// OSCACHE 实现不使用 property 元素,而是在类路径的根路径中使用标准的oscache.properties 文件进行配置。在 oscache.properties文件中,您可以配置 Cache 的算法(和上面讨论的算法很类似),Cache 的大小,持久化方法(内存,文件等)和集群方法。
要获得更详细的信息,请参考 OSCache 文档。OSCache 及其文档可以从 OpenSymphony
网站上获取:
http://www.opensymphony.com/oscache/
posted @ 2008-08-29 12:09 小马歌 阅读(923) | 评论 (0)编辑 收藏
仅列出标题
共95页: First 上一页 81 82 83 84 85 86 87 88 89 下一页 Last