smelly酱油 smelly酱油
你猜。
关注数: 2 粉丝数: 2 发帖数: 582 关注贴吧数: 4
maven 项目管理工具 简介 Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具。 目前,绝大多数开发人员都把 Ant 当作 Java 编程项目的标准构建工具。遗憾的是,Ant 的项目管理工具(作为 make的替代工具)不能满足绝大多数开发人员的需要。通过检查 Ant 构建文件,很难发现项目的相关性信息和其它元信息(如开发人员/拥有者、版本或站点主页)。 Maven 除了以程序构建能力为特色之外,还提供 Ant 所缺少的高级项目管理工具。由于 Maven 的缺省构建规则有较高的可重用性,所以常常用两三行 Maven 构建脚本就可以构建简单的项目,而使用 Ant 则需要十几行。事实上,由于 Maven 的面向项目的方法,许多 Apache Jakarta 项目现在使用 Maven,而且公司项目采用 Maven 的比例在持续增长。 Maven这个单词来自于意第绪语,意为知识的积累,最早在Jakata Turbine项目中它开始被用来试图简化构建过程。当时有很多项目,它们的Ant build文件仅有细微的差别,而JAR文件都由CVS来维护。于是Maven创始者开始了Maven这个项目,该项目的清晰定义包括,一种很方便的发布项目信息的方式,以及一种在多个项目中共享JAR的方式。 特点 maven和ant的区别 Maven:标准构建文件 project.xml 和 maven.xml 特性处理顺序 ${maven.home}/bin/driver.properties${project.home}/project.properties${project.home}/build.properties${user.home}/build.properties通过 -D 命令行选项定义的系统特性最后一个定义起决定作用。 构建规则 构建规则更为动态(类似于编程语言);它们是基于 Jelly 的可执行 XML。 扩展语言 插件是用 Jelly(XML)编写的。 构建规则可扩展性 通过定义 <preGoal> 和 <postGoal> 使构建 goal 可扩展。 Ant:标准构建文件 build.xml 特性处理顺序 通过 -D 命令行选项定义的系统特性由 <property> 任务装入的特性第一个定义最先被处理。 构建规则 构建规则或多或少是静态的,除非使用 <script> 任务。(请参阅 参考资料以获得相关教程。) 扩展语言 插件是用 Java 语言编写的。 构建规则可扩展性 构建规则不易扩展;可通过使用 <script> 任务模拟 <preGoal> 和 <postGoal> 所起的作用。
优化SQL查询:如何写出高性能SQL语句 1、 首先要搞明白什么叫执行计划?执行计划是数据库根据SQL语句和相关表的统计信息作出的一个查询方案,这个方案是由查询优化器自动分析产生的,比如一条SQL语句如果用来从一个 10万条记录的表中查1条记录,那查询优化器会选择“索引查找”方式,如果该表进行了归档,当前只剩下5000条记录了,那查询优化器就会改变方案,采用 “全表扫描”方式。可见,执行计划并不是固定的,它是“个性化的”。产生一个正确的“执行计划”有两点很重要:(1) SQL语句是否清晰地告诉查询优化器它想干什么?(2) 查询优化器得到的数据库统计信息是否是最新的、正确的? 2、 统一SQL语句的写法对于以下两句SQL语句,程序员认为是相同的,数据库查询优化器认为是不同的。 select * from dual select * From dual 其实就是大小写不同,查询分析器就认为是两句不同的SQL语句,必须进行两次解析。生成2个执行计划。所以作为程序员,应该保证相同的查询语句在任何地方都一致,多一个空格都不行! 3、 不要把SQL语句写得太复杂我经常看到,从数据库中捕捉到的一条SQL语句打印出来有2张A4纸这么长。一般来说这么复杂的语句通常都是有问题的。我拿着这2页长的SQL语句去请教原作者,结果他说时间太长,他一时也看不懂了。可想而知,连原作者都有可能看糊涂的SQL语句,数据库也一样会看糊涂。一般,将一个Select语句的结果作为子集,然后从该子集中再进行查询,这种一层嵌套语句还是比较常见的,但是根据经验,超过3层嵌套,查询优化器就很容易给出错误的执行计划。因为它被绕晕了。像这种类似人工智能的东西,终究比人的分辨力要差些,如果人都看晕了,我可以保证数据库也会晕的。另外,执行计划是可以被重用的,越简单的SQL语句被重用的可能性越高。而复杂的SQL语句只要有一个字符发生变化就必须重新解析,然后再把这一大堆垃圾塞在内存里。可想而知,数据库的效率会何等低下。 4、 使用“临时表”暂存中间结果简化SQL语句的重要方法就是采用临时表暂存中间结果,但是,临时表的好处远远不止这些,将临时结果暂存在临时表,后面的查询就在tempdb中了,这可以避免程序中多次扫描主表,也大大减少了程序执行中“共享锁”阻塞“更新锁”,减少了阻塞,提高了并发性能。 5、 OLTP系统SQL语句必须采用绑定变量 select * from orderheader where changetime > '2010-10-20 00:00:01' select * from orderheader where changetime > '2010-09-22 00:00:01' 以上两句语句,查询优化器认为是不同的SQL语句,需要解析两次。如果采用绑定变量select * from orderheader where changetime > @chgtime @chgtime变量可以传入任何值,这样大量的类似查询可以重用该执行计划了,这可以大大降低数据库解析SQL语句的负担。一次解析,多次重用,是提高数据库效率的原则。 6、 绑定变量窥测事物都存在两面性,绑定变量对大多数OLTP处理是适用的,但是也有例外。比如在where条件中的字段是“倾斜字段”的时候。“倾斜字段”指该列中的绝大多数的值都是相同的,比如一张人口调查表,其中“民族”这列,90%以上都是汉族。那么如果一个SQL语句要查询30岁的汉族人口有多少,那“民族”这列必然要被放在where条件中。这个时候如果采用绑定变量@nation会存在很大问题。试想如果@nation传入的第一个值是“汉族”,那整个执行计划必然会选择表扫描。然后,第二个值传入的是“布依族”,按理说“布依族”占的比例可能只有万分之一,应该采用索引查找。但是,由于重用了第一次解析的“汉族”的那个执行计划,那么第二次也将采用表扫描方式。这个问题就是著名的“绑定变量窥测”,建议对于“倾斜字段”不要采用绑定变量。 7、 只在必要的情况下才使用begin tranSQL Server中一句SQL语句默认就是一个事务,在该语句执行完成后也是默认commit的。其实,这就是begin tran的一个最小化的形式,好比在每句语句开头隐含了一个begin tran,结束时隐含了一个commit。有些情况下,我们需要显式声明begin tran,比如做“插、删、改”操作需要同时修改几个表,要求要么几个表都修改成功,要么都不成功。begin tran 可以起到这样的作用,它可以把若干SQL语句套在一起执行,最后再一起commit。好处是保证了数据的一致性,但任何事情都不是完美无缺的。Begin tran付出的代价是在提交之前,所有SQL语句锁住的资源都不能释放,直到commit掉。可见,如果Begin tran套住的SQL语句太多,那数据库的性能就糟糕了。在该大事务提交之前,必然会阻塞别的语句,造成block很多。Begin tran使用的原则是,在保证数据一致性的前提下,begin tran 套住的SQL语句越少越好!有些情况下可以采用触发器同步数据,不一定要用begin tran。
dwr的实例和介绍 DWR介绍: DWR是一个WEB远程调用框架,利用这个框架可以让AJAX开发变得很简单,利用DWR可以在客户端利用JavaScript直接调用服务器端的Java方法并返回值给JavaScript,就想好直接本地客户端调用一样。DWR原理: DWR工作原理就是Java类生成JavaScript,它的代码就像Ajax一样,用户感觉调用就像发生在浏览器端,但是实际上代码调用发生在服务器端。DWR下载: DWR的下载地址为:http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fdirectwebremoting.org%2Fdwr%2Fdownload&urlrefer=45d2c622e401d4cdb754bd5750cbd3cc,最新版为3.0.这里下载的应用包为dwr.war,解压后将dwr.jar包放在Web工程的WEB-INF/lib/目录中。 DWR包含2个主要部分: 1.一个运行在服务器端的Java Servlet,它处理请求并向浏览器发回响应. 2.运行在浏览器端的JavaScript,他发送请求而且还能动态更新网页。 DWR工作环境配置:配置web.xml:为了让DWR的核心Servlet起作用,必须在web.xml文件中配置核心Servlet,配置代码如下:[c-sharp] view plaincopy <!-- dwr核心servlet --> <listener> <listener-class>org.directwebremoting.servlet.DwrListener</listener-class> </listener> <servlet> <!-- dwr核心servelt实现类 --> <servlet-name>dwr</servlet-name> <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class> <!-- 设置dwr可调式 --> <init-param> <param-name>debug</param-name> <param-value>true</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> lt;servlet-mapping> <servlet-name>dwr</servlet-name> <url-pattern>/dwr/*</url-pattern> </servlet-mapping> dwr.xml是用来配置DWR的文件,默认是将其放在WEB-INF文件夹下,它的配置代码如下:[c-sharp] view plaincopy <dwr> <init> <creator id="..." class="..."/> <converter id="..." class="..."/> </init> <allow> <create creator="..." javascript="..."/> <convert converter="..." match="..."/> </allow> <signatures>...</signatures> </dwr> 1.<init>标签:在初始化部分用来创建远程beans,而且这个类能被用来以某种过程转换。如果想定义一个新的creator或者converter,就要在此被声明,在init部分的定义只是告诉DWR这些扩展类的存在,给出了如何使用的信心。这种方式很像Java中的import语句,多数类需要在使用前先import一下。每个creator和converter都用id属性,以便在后面使用时直接饮用id值。2.<allow>标签:allow部分定义了DWR能够创建和转换的类,每一个在类中被调用的方法需要一个create元素,可以使用“new”关键字或者Spring框架创建creator。<allow>元素的结构如下:<allow> <create creator = "..." javascript=".." scope="..."> <param name="..." value="..."/> <auth method="..." role="..."/> <exclude method="..."/> <include method="..."/> </create> </allow>creator的属性: a).creator="new":创建对象,使用new创建对象安全(DWR创建的对象生存时间越短,多次调用中间的值不一致的错误机会越少),内存消耗低(如果站点用户量非常大,这个创造器可以减少VM的内存溢出).b).creator="none":不创建对象,可能在使用的scope不是“page”,并在前面已经把这个对象创建到这个scope中了,这时就不需要在创建对象了。还有一种情况是要调用的方法是静态的,这时也不需要创建对象,DWR会在调用创建器之前先检查一下这个方法是不是静态的。 对于上述 a、b两种情况,仍需要class参数,用来告诉DWR它是在操作的对象类型是什么。javascript="aaa"在浏览器里创建的对象名,避免使用JavaScript保留字。这个名字将在页面里作为js被导入。例如:<create creator="new" javascript="service">
1 下一页