spring
svn checkout https://src.springframework.org/svn/spring-framework/trunk spring-framework
ant resolve
struts2
svn checkout http://svn.apache.org/repos/asf/struts/struts2/trunk struts2
svn checkout http://svn.apache.org/repos/asf/struts/xwork/trunk/ xwork
mvn install
mvn eclipse:eclipse
tomcat6
svn checkout http://svn.apache.org/repos/asf/tomcat/tc6.0.x/trunk tc6.0.x
1.下载ant 1.6.x
2. 命令行下执行 ant download,下载依赖jar.
在JavaEye论坛上回答网友joyjiang的疑问:“REST的优势到底是什么?开发效率?文档的管理?url的直观?还是其它的什么优势呢?”
REST的主要优势在我看来其实在于它是一种对于服务器的更加有效的抽象方式。
对于基于网络的应用来说,你怎么样看待服务器,就会产生什么样的架构风格,随之产生与该架构风格相关的交互模式。
RPC架构风格将服务器看作是由一些过程组成,客户端调用这些过程来执行特定的任务。SOAP就是RPC风格的一种架构。过程是动词性的(做某件事),因此RPC建模是以动词为中心的。
分布式对象架构风格认
为服务器是由一些对象和对象上的方法组成,客户端通过调用这些对象上的方法来执行特定的任务。并且客户端调用这些对象上的方法应该就像是调用本地对象上的
方法一样,这样开发就可以完全按照统一的面向对象方法来做。但是很可惜,这样的抽象并不是很有效,因为分布式对象与本地对象存在着巨大的本质差别,想要掩
盖这些差别很多时候甚至是有害无益的。
REST架构风格并
没有试图掩盖这些差别,而是将服务器抽象为一组离散资源的集合。资源是一个抽象的概念,而不是代表某个具体的东西。注意:要真正理解REST,就一定要增
强自己的抽象思维能力,充分理解到资源是抽象的。如果完全不具有抽象思维的能力,一定要将资源与数据库中的一张表或服务器端的一个文件(HTML、
Servlet、JSP、etc.)一一挂起钩来,就无法真正理解REST了。资源是名词性的,因此REST建模是以名词为中心的。
上述
是目前基于网络的应用的主要的三种抽象方式。这三种不同的抽象方式会严重影响客户端与服务器的交互模式,而不同交互模式的交互效率差别相当大。分布式对象
的交互模式很多时候效率很低,因为掩盖了分布式对象与本地对象的差别,很多时候都会导致细粒度的API(需要一再强调才能让一些不明就里的架构初哥按照正
确的方式来做设计)。实践已经证明,与RPC和分布式对象相比,REST是一种对于服务器更加有效的抽象方式,将会带来粒度更大和更有效率的交互模式。这
样的效果与Fielding设计REST的初衷是吻合的,REST就是专门为交互的性能和可伸缩性进行过优化的一种架构风格。而SOAP在设计的时候优先
考虑的从来不是性能和可伸缩性,而是互操作性。除非出现奇迹,否则你种什么,就应该长出来什么。你种的是瓜,长出来的就是瓜;你种的是豆,长出来的就是
豆。
Fielding写到:“
REST提供了一组架构约束,当作为一个整体来应用时,强调组件交互的可伸缩性、接口的通用性、组件的独立部署、以及用来减少交互延迟、增强安全性、封装遗留系统的中间组件。”
有
人认为REST不是面向对象的,其实REST虽然没有分布式对象那么面向对象,在我看来至少比RPC更加面向对象。按照《企业应用架构模式》,以动词为中
心建模是什么?是不是就是事务脚本?以名词为中心建模是什么?是不是就是领域模型?这就扯远了,网络通信是否一定需要实现为面向对象的形式,我认为是不需
要的。
“REST的主要优势在我看来其实在于它是一种对于服务器的更加有效的抽象方式。”
这句话等于是,我先把一个骨架放在这里,还没有用血肉来充实它,也就是还没有举出具体的实例来。具体的实例以后我们还需要来详细讨论。REST是非常简练的,同时又是一种非常强大的抽象方式,在我看来就是从根本上简化Web开发的一味良药。
1.位图索引用于数据仓库,不能用于普通系统
2.使用组合索引. 当大量字段同同时作为过滤条件时,使用组合索引会大大提高性能。
建立组合索引时,注意小基数字段在前,大基数字段在后。
3.同一字段出现在不同表要保持类型一致(确有需要,可使用函数索引)
4.使用count(*)
5.使用返回单个结果的查询改写外连接能取得较好的性能
Oracle优化器会自动选择以下三种方式的一种运行表连接,但在数据环境上配合强化选择合适的方式或强制使用某种方式是SQL优化的需要:
NESTED LOOP
对于被连接的数据子集较小的情况,nested loop连接是个较好的选择。nested loop就是扫描一个表,每读到一条记录,就根据索引去另一个表里面查找,没有索引一般就不会是 nested loops。
一般在nested loop中, 驱动表满足条件结果集不大,被驱动表的连接字段要有索引,这样就走nested loop。如果驱动表返回记录太多,就不适合nested loops了。如果连接字段没有索引,则适合走hash join,因为不需要索引。
可用ordered提示来改变优化器默认的驱动表,可用USE_NL(table_name1 table_name2)提示来强制使用nested loop。
HASH JOIN
hash join是优化器做大数据集连接时的常用方式。优化器扫描小表(或数据源),利用连接键(也就是根据连接字段计算hash 值)在内存中建立hash表,然后扫描大表,每读到一条记录就来探测hash表一次,找出与hash表匹配的行。
当
小表可以全部放入内存中,其成本接近全表扫描两个表的成本之和。如果表很大不能完全放入内存,这时优化器会将它分割成若干不同的分区,不能放入内存的部分
就把该分区写入磁盘的临时段,此时要有较大的临时段从而尽量提高I/O 的性能。临时段中的分区都需要换进内存做hash
join。这时候成本接近于全表扫描小表+分区数*全表扫描大表的代价和。
至于两个表都进行分区,其好处是可以使用parallel query,就是多个进程同时对不同的分区进行join,然后再合并。但是复杂。
使用hash join时,HASH_AREA_SIZE初始化参数必须足够的大,如果是9i,Oracle建议使用SQL工作区自动管理,设置WORKAREA_SIZE_POLICY 为AUTO,然后调整PGA_AGGREGATE_TARGET即可。
以下条件下hash join可能有优势:
两个巨大的表之间的连接。
在一个巨大的表和一个小表之间的连接。
可用ordered提示来改变优化默认的驱动表,可用USE_HASH(table_name1 table_name2)提示来强制使用hash join。
SORT MERGE JOIN
sort merge join的操作通常分三步:对连接的每个表做table access full;对table access full的结果进行排序;进行merge join对排序结果进行合并。sort merge join性能开销几乎都在前两步。一般是在没有索引的情况下,9i开始已经很少出现了,因为其排序成本高,大多为hash join替代了。
通常情况下hash join的效果都比sort merge join要好,然而如果行源已经被排过序,在执行sort merge join时不需要再排序了,这时sort merge join的性能会优于hash join。
在全表扫描比索引范围扫描再通过rowid进行表访问更可取的情况下,sort merge join会比nested loops性能更佳。
可用USE_MERGE(table_name1 table_name2)提示强制使用sort merge join。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class ProcessTest {
public static void main(String[] args) {
ProcessBuilder pb = new ProcessBuilder ( "tasklist");
try {
Process process = pb.start();
InputStream fis = process.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(fis));
String line = null;
StringBuffer cmdout = new StringBuffer();
while ((line = br.readLine()) != null) {
cmdout.append(line).append("\n");
}
System.out.println(cmdout.toString().trim());
} catch (IOException e) {
e.printStackTrace();
}
}
}
输出如下:
图像名 PID 会话名 会话# 内存使用
========================= ====== ================ ======== ============
System Idle Process 0 Console 0 28 K
System 4 Console 0 324 K
smss.exe 1076 Console 0 812 K
csrss.exe 1152 Console 0 3,296 K
winlogon.exe 1176 Console 0 31,580 K
services.exe 1220 Console 0 4,684 K
lsass.exe 1232 Console 0 1,672 K
svchost.exe 1408 Console 0 6,236 K
svchost.exe 1496 Console 0 5,036 K
svchost.exe 1656 Console 0 38,656 K
spoolsv.exe 1872 Console 0 8,000 K
explorer.exe 332 Console 0 18,888 K
avp.exe 376 Console 0 24,960 K
db2dasrrm.exe 460 Console 0 34,652 K
TSVNCache.exe 672 Console 0 12,476 K
igfxtray.exe 1380 Console 0 7,344 K
hkcmd.exe 1236 Console 0 4,056 K
igfxpers.exe 1428 Console 0 3,468 K
db2mgmtsvc.exe 1444 Console 0 10,072 K
RTHDCPL.exe 1460 Console 0 32,480 K
igfxsrvc.exe 1572 Console 0 3,772 K
avp.exe 1680 Console 0 6,008 K
db2systray.exe 1700 Console 0 32,512 K
ctfmon.exe 1780 Console 0 4,892 K
picpick.exe 1984 Console 0 3,600 K
QQ.exe 2024 Console 0 34,648 K
dsNcService.exe 264 Console 0 3,880 K
365日历.EXE 1952 Console 0 43,788 K
CLCL.exe 1028 Console 0 8,252 K
klnagent.exe 1052 Console 0 3,196 K
thunderbird.exe 352 Console 0 38,692 K
rtxc.exe 472 Console 0 29,968 K
db2rcmd.exe 1836 Console 0 11,832 K
TXPlatform.exe 2488 Console 0 3,808 K
firefox.exe 2724 Console 0 195,912 K
cmd.exe 2716 Console 0 52 K
sh.exe 3936 Console 0 152 K
conime.exe 2752 Console 0 3,424 K
eclipse.exe 3060 Console 0 2,592 K
JAVAW.EXE 2984 Console 0 446,692 K
EXCEL.EXE 3232 Console 0 1,936 K
wmiprvse.exe 4084 Console 0 6,368 K
JAVAW.EXE 320 Console 0 6,860 K
tasklist.exe 2936 Console 0 4,812 K
当运行其他命令 ,如dir等时,用如下写法:
ProcessBuilder pb = new ProcessBuilder ( "cmd", "/c", "dir");
Ubuntu下上网解析DNS慢有很大程度上是和IPV6有关,而目前国内大部分地方都还没有IPV6网络,所以一般用户应该需要关闭IPV6
网上流传着很多IPV6的关闭方法,但是经过测试大部分都是针对老版本的,而且效果不好。
这里提供一种方法作为参考
/proc/sys/net/ipv6/conf/lo/disable_ipv6
这个档案,用cat指令可以看到 0 这个数字,将他设定为1就可以了。
因为已经将ipv6编入kernel,因此在proc里面就可以看得到相关的设定。
设定的方式有很多种,有的是用echo 1 >> [路径]/档桉名称
的方式,这种方式是每次开机以后就得要打一次。
所以延伸出第二个方法,在rcS.d里面设定一个连结,去执行这个指令的script。
第3个方法,就是设定sysctl.conf档桉,也是最正统的做法。
位置在
/etc/sysctl.conf
这个档桉可以设定很多,包括要当成NAT时的封包转发等等。
要设定
/proc/sys/net/ipv6/conf/lo/disable_ipv6
这个档桉,就是在sysctl.conf里面加上
net.ipv6.conf.lo.disable_ipv6 = 1