知识积累总结.docx
- 文档编号:10810006
- 上传时间:2023-02-23
- 格式:DOCX
- 页数:66
- 大小:870.82KB
知识积累总结.docx
《知识积累总结.docx》由会员分享,可在线阅读,更多相关《知识积累总结.docx(66页珍藏版)》请在冰豆网上搜索。
知识积累总结
项目知识点总结
1、.classpath文件配置jar包和手动复制jar到lib文件夹下的区别
前者的方式是在IDE编译时会根据文件中jar包的位置找到jar包,而部署运行时不会打包到文件中,
所以即使在IDE中编译时没有错误,也不能部署运行成功;
后者的方式是手动添加jar包,jar包会依赖存在于这个项目中,编译或部署时都会找到对应jar包,优先选择这种方式
利用Maven构建项目会更利于项目的编译、打包、部署和管理
2、数据连接池
在工程启动时会根据连接池的配置信息建立多个连接,并把它们放到一起集中管理,形象的比作一个池子,
使用连接池,将有池来管理相关的数据库连接,减少对数据库连接操作利用连接池可以对优化资源的分配、
提高系统的响应速度、方便数据库连接的管理,常用的连接池有DBCP和C3P0:
DBCP是apache上的一个java连接池项目,也是tomcat使用的连接池组件
C3P0是一个开放源代码的JDBC连接池,它在lib目录中与Hibernate一起发布,基于JDBC3.0规范,
DBCP有着比C3P0更高的效率,但是实际应用中,DBCP可能出现丢失连接的可能,而C3P0稳定性较高。
因此在实际应用中,C3P0使用较为广泛
3、DAO层编写一个基类BaseDao
基类通过反射获取子类确定的泛型类,每个DAO类都对应操作一个PO对象,
所以其他DAO类可以继承这个基类DAO,不但可以复用共同点方法,还可以获得泛型的好处
4、Struts2和SpringMVC的比较
这个项目采用的是SpringMVC3.0+Spring3.0.5+Hibernate3.0的架构,SpringMVC3.0对比Struts2最大的不同是一个Controller可以处理多种不同的请求,避免了Controller类的冗余,Struts2是类级别的拦截,SpringMVC是方法级别的拦截,所以性能上SpringMVC要优于Struts2,但是Struts2的核心是基于拦截器的,所以Struts2的拦截机制比SpringMVC要强大,具体对比下图所示:
所以一般在web层都会建立一个基类BaseController,将Controller类中的公共方法提取出来,其他Controller类都继承这个基类。
5、Hibernate一级缓存和二级缓存
eclipse连接Database后建立JPA工程,反向生成Hibernate注解样式的持久化对象
一级缓存是Session实现的,天生拥有不可拆卸的,不是很重要,无须关注。
二级缓存是通过第三方缓存插件实现的缓存方式,默认情况下二级缓存是关闭的,合理的使用二级缓存可以有效的减少对数据的连接次数,提高系统的性能。
常用的二级缓存插件有EHCache、JBossCache、MemCache,其中EHCache和JBossCache是基于java实现的支持分布式集群的高效缓存组件,缓存可以存储在内存和硬盘上,而MemCache是基于C语言实现的高性能集中式缓存组件,缓存只能存储在内存上,集中式缓存与分布式缓存不同的是集中式缓存为每一个应用节点提供统一的缓存服务,因此每个应用节点不存在缓存同步的问题。
二级级存:
进程级别或群集级别缓存:
这里面存放的可以是关联的持久化对象,也可以是持久化对象的散装数据,它能被当前进程的所有事务访问。
当里面存放的是关联的持久化对象,当不同的事务访问这些对象时,就会产生并发的几类问题,所在不提倡这种存放形式。
当访问持久化对象的散装数据时,每个事务会根据这些散装对象重新组装持久化对象,所在不同的事务之间会获的不同的持久化对象,也就是说在组装完成后,对这些对象的访问不会存在并发问题,它的并发问题被移置到了获得散装数据的范围。
在获取散装数据时,为了保证获取正确的数据,所以会存在并发问题
为了解决二级缓存的并发问题,hibernate提供了4种访问策略:
1.事务型(CacheConcurrencyStrategy.TRANSACTIONAL):
仅在受管理的环境中适用。
适用于经常被读,但很少被修改的数据,可以防止脏读和不可重复读。
2.读写型(CacheConcurrencyStrategy.READ_WRITE):
仅在非集群环境中适用。
适用于经常被读,但很少被修改的数据,可以防止脏读。
3.非严格读写(CacheConcurrencyStrategy.NONSTRICT_READ_WRITE):
不保证缓存中的数据和数据库中的数据的一致性。
必须为它设置过期时间,适用于极少被修改,偶尔允许脏读。
4.只读型(CacheConcurrencyStrategy.READ_ONLY):
适用于从不会被修改的数据。
这四种策略中,事务型的隔离级别最高,只读型最低,在读写二级缓存只的数据时,如果经常被修改,则需要的隔离级别就越高,但并发效率就越低,因此只有满足以下条件的数据才适合存放到二级缓存中:
1.很少被修改
2.不是很重要的数据,偶尔允许出现并发问题。
3.不会被并发访问的数据
4.参考数据
对于以下类型的数据不适合存放到二级缓存中:
1.经常被修改
2.财务数据,不允许出现并发访问。
3.与其他应用共享的数据。
因为使用了二级缓存的hibernate应用与其他应用共享数据,
当其他应用修改了数据,hibernate无法保证与数据库中数据的一致性。
memcache和ehcache
ehcache是纯java编写的,通信是通过RMI方式,适用于基于java技术的项目。
memcached服务器端是c编写的,客户端有多个语言的实现,如c,php(淘宝,sina等各大门户网站),python(豆瓣网), java(Xmemcached,spymemcached)。
memcached服务器端是使用文本或者二进制通信的。
基于Spring+Hibernate的框架EHCache缓存组件的使用方式:
1、在基于JPA注解配置的实体对象或配置SessionFactory的xml文件中配置定义缓存策略
2、配置第三方缓存组件自己的配置文件
3、参考文章
6、SpringAOP面向切面编程
AOP编程的切面配置有XML配置和@AspectJ注解两种方式,其核心实现原理就是CGLib和JDK动态代理,在一个项目中可以混合使用Spring提供的各种切面定义方式。
AOP编程方式只适用于那些具有横切逻辑的应用场合,例如:
事务管理、性能监测、操作控制,通俗理解AOP就是将重复性的横切逻辑独立出来,把这些独立的逻辑融合到业务逻辑中完成和原来一样的业务操作。
切面>增强类型、切点>横切逻辑
7、数据库优化
1)基本方法
1、取消外键约束:
有外键约束会影响插入和删除性能,如果程序能够保证数据的完整性,那在设计数据库时就去掉外键
2、适当使用子查询:
m*nselect*fromflight,city
whereflight.startcityid=city.cityidandcity.name='beijing';
m+nselect*fromflightwherestartcityid=(selectcityidfromcitywherecityname='beijing');
3、sql语句全部大写,特别是列名和表名都大写
4、等等….
2)高级方法
1、对表中字段添加索引
2、对数据库表进行分区
3、根据业务合理调整表结构
4、编写存储过程和触发器定时刷新中间表
8、SpringMVC接收表单参数
1、直接把表单的参数写在Controller相应的方法的形参中,示例:
publicStringaddUser1(StringuserName,Stringpassword){}
2、通过HttpServletRequest接收,示例:
publicStringaddUser2(HttpServletRequestrequest){
StringuserName=request.getParameter("userName");
Stringpassword=request.getParameter("password");}
3、通过一个bean来接收,示例:
publicStringaddUser3(Useruser){}
4、通过json数据传递参数,依然可以通过一个bean来接收,示例:
varuser={userName:
name,password:
pass};//拼装成json格式,然后通过传递user来传递表单数据
5、使用jQuery的serializeArray() 方法序列化表单元素;如果表单元素很多,手工拼装成json数据非常麻烦,可以使用jQuery提供的serializeArray()方法序列化表单元素,返回json数据结构数据来传递参数,依然可以使用bean来接收json数据,示例:
在JS中建立varparams=$("#userForm").serializeArray();然后通过传递params来传递表单数据
9、Spring事务的传播机制
1、Spring对事务的控制是在TransactionDefinition类中描述的,该类有以下几个重要接口方法:
事务的传播行为intgetPropagationBehavior()、
事务的隔离级别intgetIsolationLevel()、
事务的过期时间intgetTimeout()、
事务的读写特性booleanisReadOnly()
所谓事务的传播行为,就是多个事务方法相互调用时,事务如何在这些方法间传播
2、不能被SpringAOP事务增强的方法
基于接口的动态代理:
除public外的所有方法和publicstatic
基于CGLib的动态代理:
private、static、final
3、ORM+JDBC混合框架
优秀的ORM框架(Hibernate、JPA、JDO)对于底层SQL的控制很不方便,而像JDBC框架(IBatis、SpringJDBC)通过模板可以很好的控制底层SQL,但是没有Hibernate那样的开发效率,没有那一种数据访问技术是最优秀的,只有在特定环境中去界定,所以在一个应用中往往采用ORM框架+JDBC框架的组合技术,而Spring的事务管理能力很好的实现了两种框架结合后事务管理的问题,由于ORM框架的会话Session是对JDBC框架连接Connection的封装,Spring可以智能的在同一事务线程中让ORM框架的会话封装JDBC框架的连接,所以只要采用ORM框架的事务管理器就可以了,无须配置两个事务管理器。
10、JAVA垃圾回收机制
Java的垃圾回收机制是Java虚拟机提供的能力,用于在空闲时间以不定时的方式动态回收无任何引用的对象占据的内存空间。
11、Comparable与Comparator接口比较
Comparable,“可比较的”。
使用这种策略来比较时,两个对象本身必须是“可比较的”,比较的标准由对象所在的类定义,这种可比较的能力是对象本身固有的,因此不需要第三者参与就可以完成比较。
compareTo()方法只要一个参数,因为这里只有“你”“我”的关系,没有第三者。
比如,两个人要比较身高,分辨高矮是人类固有的能力,两个人只要站到一起就能分出谁高谁矮。
Comparator,“比较器”。
使用这种策略来比较时,如何进行比较和两个对象本身无关,而是由第三者(即比较器)来完成的。
只要实现Comparator接口,任何一个对象都可能成为一个“比较器”,但比较器并不是比较自己的实例,而是比较另外两个对象,比较器在这里充当“仲裁者”的角色,这也就是为什么compare()方法需要两个参数。
比如,两个人要比较谁智商更高,靠他们自身无法进行,这时要借助一个比较器(比如,智商测试题)。
Collections.sort()有两种策略:
一种是让集合元素本身实现Comparable接口,另一种是使用用户提供的比较器(即Comparator)
Comparable接口的compareTo()方法约定:
本对象大于另一个对象时,返回大于0的整数,小于时返回小于0的整数,等于时返回0
Comparator接口的compare()方法返回的整数来比较两个对象,规则和compareTo()一样,可以定义一系列比较器,供排序时选择使用
12、HashMap源码分析
publicclassHashMap
extendsAbstractMap
implementsMap
{//默认初始化容量大小
staticfinalintDEFAULT_INITIAL_CAPACITY=16;
//加载因子
staticfinalfloatDEFAULT_LOAD_FACTOR=0.75f;
//通过一系列数学算法得到对象的哈希值,相同对象哈希值是相同的
staticinthash(inth){
h^=(h>>>20)^(h>>>12);
returnh^(h>>>7)^(h>>>4);
}
//得到的对象哈希值与容量大小减1后的值进行与运算,随机得到key值存储的位置
//因为容量初始化时必须是2的n次方,所以减1后的值肯定是奇数,和奇数与运算得到不同//位置的值的效率要比和偶数与运算要高
staticintindexFor(inth,intlength){
returnh&(length-1);
}
publicVget(Objectkey){
//得到key为null时对应的value值
if(key==null)
returngetForNullKey();
//得到对象的哈希值进行和奇数与运算的存储位置后取得value值
inthash=hash(key.hashCode());
for(Entry
e!
=null;
e=e.next){
Objectk;
if(e.hash==hash&&((k=e.key)==key||key.equals(k)))
returne.value;
}
//不存在对应value值,则返回null
returnnull;
}
publicVput(Kkey,Vvalue){
//如果key为null,对null值进行存储,它对应的value可以为null,也可以为对象//或值,但是只允许有一个key为null
if(key==null)
returnputForNullKey(value);
//通过得到的哈希值进行和奇数与运算得到存储位置
inthash=hash(key.hashCode());
inti=indexFor(hash,table.length);
//如果得到的位置中已经占用,则进行替换新值返回旧值,所以map中的key不允许有重复的值
for(Entry
=null;e=e.next){
Objectk;
if(e.hash==hash&&((k=e.key)==key||key.equals(k))){
VoldValue=e.value;
e.value=value;
e.recordAccess(this);
returnoldValue;
}
}
modCount++;
//添加键值对,如果哈希表中的条目数大于容量乘以加载因子,则要进行扩容,非常影响效率,所以如果在能够确定存储对象条目数的时候,最好初始化容量和加载因子,保证初始容量大于最大条目数除以加载因子
addEntry(hash,key,value,i);
returnnull;
}
}
13、jaxws-webservice总结
随着近几年来,SOA,EAI等架构体系的日渐成熟,Webservice越来越炽手可热,尤其是在企业做异质平台整合时成为了首选的技术。
Java的Webservice技术更是层出不穷,比较流行的有:
Axis2,SpringWS以及Jaxws。
Jaxws是目前最标准,需要额外第三方插件最少,配置最少最灵活的webservice。
JAX-WS2.0有两种开发过程:
自顶向下和自底向上:
自顶向下方式指通过一个WSDL文件来创建WebService
自底向上是从Java类出发创建WebService
两种开发过程最终形成的文件包括:
1.SEI。
一个SEI对应WSDL中WebService的一个port,在Java中是一个Java接口。
2.SEI实现类。
3.WSDL和XSD文件
比较普遍使用的是选用Server端通过JavaClass生成webservice,而客户端通过wsdl生成Java调用类的做法,下面对这种方式构建的webservice进行总结
server端
第一步编写webservice:
importjavax.jws.WebMethod;
importjavax.jws.WebService;
@WebService
publicclassHello{
@WebMethod
publicStringsay(Stringname){
return("Hello:
"+name);
}
}
@WebService
注释在了Class之上,这告诉了JAXWS,此类为Webservice。
@WebMethod
注释在了public方法上,这告诉了JAXWS,此方法为soap方法
第二步生成wsdl和xsd
Wsgen:
主要用于Server端通过Java类编译成Webservice的wsdl文件,运行完下面的语句后,在工程里建立的wsdl文件夹中会生成wsdl和xsd文件
D:
\workspace\JaxWSProject>wsgen-cpD:
\workspace\JaxWSProject\bin-wsdlcom.jax.test.Hello-swssrc-rwsdl
D:
\workspace\JaxWSProject是工程项目的所在位置
-wsdl参数代表生成webservice
-s参数代表生成的.java文件置于何处
-r参数代表生成的.wsdl文件与.xsd文件生成在何处
-cp参数代表classpath,即Hello.class的所在
第三步部署webservice
在工程的WEB-INF目录下建立“sun-jaxws.xml”文件,内容如下:
xmlversion="1.0"encoding="UTF-8"?
>
url-pattern='/HelloService'/> url-pattern: web访问路径 name: webservice名称 implementation: webservice包路径 因为发布时会自动加载该名称的文件,所以文件名称必须为sun-jaxws.xml 修改web.xml文件 com.sun.xml.ws.transport.http.servlet.WSServletContextListener 最后导入jaxws相关的所有jar包,将项目中webroot文件夹下所有的文件拷贝到tomcat/webapps中建立好的工程文件夹下,在浏览器中输入以下地址,显示出wsdl内容,代表webservice建立成功 http: //localhost: 8080/JaxWSSample/HelloService? wsdl client端 同步调用: 很好理解,即一来一回,Client端request到Server端,Sever端立刻回一个response。 异步调用: 就是客户端调用一次服务端后,服务端处理事务并不是即时返回的,服务端在处理接收和解析文件时,客户端不会马上得到一个响应,它会等待一段时间,等服务器处理完后,再通知客户端“我处理完了” 第一步解析wsdl文件java文件 wsimport工具主要用于Client端(调用端)通过wsdl编译出调用Server端的Java文件 同步客户端产生方式: D: \workspace\JaxWSProject>wsimport-keep-dbin-ssrc-pcom.jax.testClientwsdl/HelloService.wsdl D: \workspace\JaxWSProject是工程项目的所在位置 -s参数代表生成的.java文件置于何处 -d参数代表生成的编译class文件置于何处 -p参数代表生成的.java源文件的包路径名称 最后的wsdl/HelloService.wsdl参数代表wsdl文件所在位置 异步客户端产生方式: 如果要产生异步客户端命令,需要在工程根目录下建一个binding.xml的文件 xmlversion="1.0"encoding="UTF-8"? > xsd="http: //www.w3.org/2001/XMLSchema" xmlns: wsdl="http: //schemas.xmlsoap.org/wsdl/"wsdlLo
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 知识 积累 总结