Java Web学习总结(36)——JavaEE知识体系及项目开发过程的总结

来源:互联网 发布:java高级编程 jb51 编辑:程序博客网 时间:2024/06/06 03:16

一、代码优化
代码结构层次的优化(目的:更加方便代码的维护--可维护性,可读性)
1.代码注释(代码规范)
2.工具类的封装(方便代码的维护,使代码结构更加清晰不臃肿,保证团队里代码 质量一致性)
3.公共部分的提取
代码性能的优化(目的:使程序的性能最优化)
1.使用一些性能比较高的类(bufferInputStream)
2.缓冲区块的大小(4k或者8k)
3.公共部分的提取
4.通常要用stringbuffer替代string加号拼接
二、业务优化
我们做项目的时候业务优化这方面最主要是从用户体验度角度进行考虑,减少用户操 作的步骤提高工作效率,通常有以下几种:
1.可以通过tabindex属性来改变tab键盘的操作顺序
2.可以通过回车键来进行搜索或者提交操作
3.对于单选按钮和复选按钮可以通过操作后面的文本来选择前面的单选按钮以及复选 按钮
4.添加的信息要按照id倒序进行排列
5.进行搜索操作时加入js loading操作(不仅告诉用户所进行的请求正在被处理,而 且防止用户多次点击提交操作)
6.当进行删除操作的时候要弹出提示框,警告用户要进行删除操作,是否确认。
7.根据returnURL在用户登录成功后直接跳到想要访问的资源。
8.进行删除操作时通过confirm提示用户是否确认删除操作,操作完后提示操作是否 成功。
9.减少用户操作的步骤
10.使用autocomplete插件快速进行搜索
必背,必做:
1.可以通过回车键来进行搜索或者提交操作
2.添加的信息要按照id倒序进行排列
3.进行搜索操作时加入js loading操作(不仅告诉用户所进行的请求正在被处理,而且防止用户多次点击提交操作)
4.当进行删除操作的时候要弹出提示框,警告用户要进行删除操作,是否确认,如果删除成功则弹出提示框告诉用户。
5.减少用户操作的步骤
6.通过ztree,以及kindeiditor来提高用户的体验度
三、sql优化
1、SELECT子句中避免使用 *, 尽量应该根据业务需求按字段进行查询
2、尽量多使用COMMIT如对大数据量的分段批量提交释放了资源,减轻了服务器压力
3、在写sql语句的话,尽量保持每次查询的sql语句字段用大写,因为oracle总是先解析 sql语句,把小写的字母转换成大写的再执行
4、用UNION-ALL 替换UNION,因为UNION-ALL不会过滤重复数据,所执行效率 要快于UNION,并且UNION可以自动排序,而UNION-ALL不会
5、避免在索引列上使用计算和函数,这样索引就不能使用
Sql优化精简版:
1.(重点)(必须说) SELECT语句中避免使用 *,
尽量应该根据业务需求按字段进行查询
举例:如果表中有个字段用的是clob或者是blob这种大数据字段的话,
他们的查询应该根据业务需要来进行指定字段的查询,切记勿直接用*
2.(重点) 删除重复记录(oracle):
最高效的删除重复记录方法 ( 因为使用了ROWID)例子:
DELETE FROM EMP E WHERE E.ROWID > (SELECT MIN(X.ROWID)
FROM EMP X WHERE X.EMP_NO = E.EMP_NO);
3. 用>=替换>
如一个表有100万记录,一个数值型字段A,
A=0时,有30万条;
A=1时,有30万条;
A=2时,有39万条;
A=3时,有1万记录。
那么执行 A>2 与 A>=3 的效果就有很大的区别了,因为 A>2 时,
ORACLE会先找出为2的记录索引再进行比较,
而A>=3时ORACLE则直接找到=3的记录索引。
4.(重点)尽量多使用COMMIT
如对大数据量的分段批量提交
5. (重点)用NOT EXISTS 或(外连接+判断为空)方案 替换 NOT IN操作符
此操作是强列推荐不使用的,因为它不能应用表的索引。
推荐方案:用NOT EXISTS 或(外连接+判断为空)方案代替
6.(重点 必须说)LIKE操作符(大数据的全文检索使用luncene)(solr)
因为使用like不当,会导致性能问题,原因是like在左右两边都有
%的时候,不会使用索引。
如LIKE '%5400%' 这种查询不会引用索引,
而LIKE 'X5400%' 则会引用范围索引。
一个实际例子:
查询营业编号 YY_BH LIKE '%5400%' 这个条件会产生全表扫描,
如果改成 YY_BH LIKE 'X5400%' OR YY_BH LIKE 'B5400%'
则会利用 YY_BH 的索引进行两个范围的查询,性能肯定大大提高。
7.(重点,必须说)避免在索引列上使用计算和函数,这样索引就不能使用
举例:
低效:
SELECT … FROM DEPT WHERE SAL * 12 > 25000;
高效:
SELECT … FROM DEPT WHERE SAL > 25000/12;
8.(重点 必须说)用UNION-ALL 替换UNION,
因为UNION-ALL不会过滤重复数据而且不会自动排序,
所执行效率要快于UNION。
9. (优化,重点,3个方面 a.缓存 b.分段批量 c.存储过程)减少访问数据库的次数
举例:如果批量删除多条数据,可以用 delete from tableName where id
in (1,2,3)
而不要用多条delete语句进行删除
10.(重点 必须说)用TRUNCATE替代DELETE
TRUNCATE不记录日志,DELETE记录日志,所以TRUNCATE要快于DELETE
但是一旦用TRUNCATE进行删除就不能进行恢复,TRUNCATE是删除整张表的数据
不能加where条件。
==================================================================
mysql,sqlserver中如果
id为自增类型,那么如果用TRUNCATE删除,则id字段再插入数据时从1开始,
如果delete删除的话,则从删除之前的id的值继续增长。
四、防sql注入
针对防sql注入,我们通常是这样做的:
首先在前台页面对用户输入信息进行js验证,对一些特殊字符进行屏蔽,
比如:or ,单引号,--,= ,还有就是限制用户名输入的长度,我们一般
将其限制在6---13位。另外,对于用户的敏感信息我们进行Md5加密,还有
,为了增加用户体验度和用户友好度,为了不使用户看到一些详细的异常信息
我们会进行错误信息页面的定制,像404,500错误。另一个我层面讲,这样做
也是为了保护我们的一些重要信息。此外,我们会给特定的人分配定定的权限
,而不是给其分配管理员权限!
sql注入
所谓SQL注入,就是通过一些含有特殊字符的sql语句发送到服务器欺骗服务器并进行攻击。(特殊字符:or, 单引号,--,空格)
Sql注入的防护
1.永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式(js正则或者java后台正则),或限制长度;对单引号和双"-"进行转换等。
2.永远不要使用动态拼装sql,使用参数化的sql。(永远不要使用+号拼接sql字符串,而是使用?传参的方式进行)
3.不要给用户太高的权限而根据需求进行赋权
4.对敏感信息进行加密 如md5(单向加密不可逆转)。
5.自定义错误页面。目的是为了不把我们的程序的bug暴露在别有用心的人的面前。而去不会让用户看到报错的页面,也提高了用户的体验度。
SQL注入防范
使用参数化的过滤性语句
要防御SQL注入,用户的输入就绝对不能直接被嵌入到SQL语句中。恰恰相反,用户的输入必须进行过滤,或者使用参数化的语句。参数化的语句使用参数而不是将用户输入嵌入到语句中。在多数情况中,SQL语句就得以修正。然后,用户输入就被限于一个参数。
输入验证
检查用户输入的合法性,确信输入的内容只包含合法的数据。数据检查应当在客户端和服务器端(java代码)都执行之所以要执行服务器端验证,是为了弥补客户端验证机制脆弱的安全性。
在客户端,攻击者完全有可能获得网页的源代码,修改验证合法性的脚本(或者直接删除脚本),然后将非法内容通过修改后的表单提交给服务器。因此,要保证验证操作确实已经执行,唯一的办法就是在服务器端也执行验证。你可以使用许多内建的验证对象,例如Regular Expression Validator,它们能够自动生成验证用的客户端脚本,当然你也可以插入服务器端的方法调用。如果找不到现成的验证对象,你可以通过Custom Validator自己创建一个。
错误消息处理
防范SQL注入,还要避免出现一些详细的错误消息,因为黑客们可以利用这些消息。要使用一种标准的输入确认机制来验证所有的输入数据的长度、类型、语句、企业规则等。
加密处理
将用户登录名称、密码等数据加密保存。加密用户输入的数据,然后再将它与数据库中保存的数据比较,这相当于对用户输入的数据进行了“消毒”处理,用户输入的数据不再对数据库有任何特殊的意义,从而也就防止了攻击者注入SQL命令。
存储过程来执行所有的查询
SQL参数的传递方式将防止攻击者利用单引号和连字符实施攻击。此外,它还使得数据库权限可以限制到只允许特定的存储过程执行,所有的用户输入必须遵从被调用的存储过程的安全上下文,这样就很难再发生注入式攻击了。
使用专业的漏洞扫描工具
攻击者们目前正在自动搜索攻击目标并实施攻击,其技术甚至可以轻易地被应用于其它的Web架构中的漏洞。企业应当投资于一些专业的漏洞扫描工具,如大名鼎鼎的Acunetix的Web漏洞扫描程序等。一个完善的漏洞扫描程序不同于网络扫描程序,它专门查找网站上的SQL注入式漏洞。最新的漏洞扫描程序可以查找最新发现的漏洞。
确保数据库安全
锁定你的数据库的安全,只给访问数据库的web应用功能所需的最低的权限,撤销不必要的公共许可,使用强大的加密技术来保护敏感数据并维护审查跟踪。如果web应用不需要访问某些表,那么确认它没有访问这些表的权限。如果web应用只需要只读的权限,那么就禁止它对此表的 drop 、insert、update、delete 的权限,并确保数据库打了最新补丁。
安全审评
在部署应用系统前,始终要做安全审评。建立一个正式的安全过程,并且每次做更新时,要对所有的编码做审评。开发队伍在正式上线前会做很详细的安全审评,然后在几周或几个月之后他们做一些很小的更新时,他们会跳过安全审评这关, “就是一个小小的更新,我们以后再做编码审评好了”。请始终坚持做安全审评。
五、数据库中常用术语:
ddl:数据定义语言 Create Drop Alter
dml:数据操纵语言 insert update delete select
dcl:数据控制语言 grant revoke
tcl:事务控制语言 commit rollback
二十一、Apache+Tomcat 实现负载均衡及seesion复制
当我们tomcat访问量大,线程连接数不够时,我们考虑到了tomcat的负载均衡来分担过多的访问.性能方面负载均衡也能利用多台tomcat来增大内存量,
流程,准备工作apache,Jk_mod,tomcat,在apache的conf/httpd.conf文件中 使用include 标签引入我们自定义的一个mood_jl.conf,在modules中引入下载的k_mod-apache-X.X.XX.so文件,在其中引入我们的.so,及work.properties文件,及指定负载分配控制器controller,在work.properties文件中worker.list=controller,tomcat1,tomcat2指定service,worker.tomcat1.port Ajp端口号,type 是ajp,host为指定ip,lbfactor 指定分配权重值越大分担请求越多,worker.controller.type=lbworker.controller.balanced_workers=tomcat1,tomcat2 指定分担请求的tomcat Session的复制在tomcat中service.xml中Engine标签加入 jvmRoute 值为work,properties中指定的tomcat名称,然后打开<Cluster标签的注释,最后在应用中程序的web.xml文件中增加<distributable/>。
我们在做这个项目时,我们考虑到服务器性能的问题,我们最开始想到使用纵向扩展,来增加硬件的配置提高其性能,但这样做比较耗费资金,而且服务器内存空间也是有限的;所以后来就想到使用横向扩展来达到这一目的
当时我们的apache是通过jk借助于ajp协议与tomcat进行通信的,在我们不进行负载均衡之前,那所有的请求都由一台tomcat进行处理,这样会使我们的tomcat所承受的压力增大,而我们进行负载均衡之后,同样数量的请求经过apache和jk将其分发到多台tomcat进行处理,从而降低每台tomcat所承受的压力,而且当其中一台机器宕机时,其他机器还可以继续提供服务,保证服务不间断。
在这个过程中,我们遇到了session问题,然后我此昂到用session复制来解决这个问题;
在apache的配置文件中增加session粘带特性:
worker.lb.sticky_session=1
worker.lb.sticky_session_force=0
Tomcat的配置
修改server.xml文件:
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">
增加jvmRoute=”tomcat2” *. jvmRoute赋的值为worker.properties中配置的相应的server名一致
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/> 将此配置的注释去掉
修改应用的web.xml文件
在应用中的web.xml文件中增加<distributable/>。
如果这样做,当第一次访问的时候,会把所以数据全部缓存到第一台服务器上,通过web配置文件,会把第一台缓存的数据全部复制到第二胎服务器上,这样做就加大网路通信量,导致阻塞,所以我们就想到了可以通过memcached分布式缓存来存取session从而解决上述问题。
二十二、Ant业务场景
Ant是基于java语言编写的,因此具有跨平台的特性,此外还具有简洁方便,灵活
配置的特性,因此我就在XX项目中使用ant进行项目的编译,打包,部署操作。使用ant
之后,如果我们在客户那里修改代码后,就可以直接使用ant进行编译,打包,部署,而不需要为了编译,打包,部署专门在客户那里安装eclipse.此外使用ant也可以直接和svn进行交互,下载源码的同时进行编译,打包,部署。
二十三、maven业务场景
maven业务场景
前段时间在研究maven,知道maven是一个项目管理工具,其核心特点就是通过
maven可以进行包的依赖管理,保证jar包版本的一致性,以及可以使多个项目共享
jar包,从而能够在开发大型j2ee应用的时候,减小项目的大小,并且和ant
比起来,maven根据“约定优于配置”的特性,可以对其项目的编译打包部署进行了
更为抽象的封装,使得自己不需要像ant那样进行详细配置文件的编写,直接使用
系统预定好的mvn clean,compile,test,package等命令进行项目的操作。于是我就
在XX项目中采用了maven,为了保证团队中的成员能够节省下载jar包所需要的时间,
于是我就采用nexus搭建了在局域网内的maven私服,然后通过配置settings.xml中
建立mirror镜像,将所有下载jar包的请求都转发到maven私服上,之后通过在pom.xml
即(project object model)中配置项目所依赖的jar包,从而达到在构建项目的时候,
先从本地仓库中查找,如果不存在从内部私服查找,如果不存在最后再从外网central
服务器查找的机制,达到了节省下载带宽,提高开发效率,以及jar包重用的目的。
ant业务场景
ant是基于java语言编写的,因此具有跨平台的特性,此外还具有简洁方便,灵活
配置的特性,因此我就在XX项目中使用ant进行项目的编译,打包,部署操作。使用ant
之后,如果我们在客户那里修改代码后,就可以直接使用ant进行编译,打包,部署,
而不需要为了编译,打包,部署专门在客户那里安装eclipse.此外使用ant也可以
直接和svn进行交互,下载源码的同时进行编译,打包,部署。
maven的常用命令
mvn eclipse:clean eclipse:eclipse -Dwtpversion=2.0
mvn clean package
maven的生命周期是独立的,但是生命周期下的阶段是相互关联并且延续的。
maven的生命周期
clean(清理):clean;default(默认):compile,test,packageinstall;site(站点)
二十四、Servlet的概述:
Servlet是一个web容器,我们通常用的servlet是httpservlet,而httpservlet又是继承于genericservlet,而genericservlet又实现了servlet接口
servlet的生命周期是 :先进行实例化,然后是初始化,然后是提高服务,然后销毁,最后不可用,在这五个生命周期,其中,初始化是调用的init方法,这个方法只有一个,而提高服务的时候调用的是service方法,而我们具体在我们所写的这个方法中,因为我们继承了httpservlet,其实就是对应了doGet(),doPost(),这种方法,然后据我了解,servlet是单例的。非线程安全的,我们通常有一下几种方案来解决:
第一种,继承SingleThreadModel但是这样每次都会创建一个新的servlet实例,但这样消耗服务器的内存,降低了性能,并且这个接口现在已经过时了,不推荐使用。
第二种:我们尽量避免使用全局变量,就我个人而言,我比较喜欢使用这种方法。
第三种,我们可以通过使用ThreadLocal, 内部结构是一个Map结构,用当前线程作为key,他会创建多个副本。get,set方法
第四种,我们当然还可以来加锁,进行解决线程问题。
而且我还知道,向我们这种常用的MVC框架,struts1,spring这些MVC框架,都是基于servlet发展而来的,就比如struts1 的核心总控制器是ActionServlet,而springMVC的前端总控制器是dispatchServlet,在项目我们曾经用serlet来生成 图片验证码的,防止用户进行暴力破解
(别人问了,再回答)
servlet的配置文件 web.xml
<servlet>
<servlet-name>ImageCodeServlet</servlet-name> <servlet-class>org.leopard.code.ImageCodeServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ImageCodeServlet</servlet-name>
<url-pattern>/d</url-pattern>
</servlet-mapping>
描述:
我在web.xml中,我首先需要写一个servlet标签,servlet标签中有两个子标签,一个叫servlet-name,这个name可以随便起,但是要保证唯一性,除此之外,在这个servlet-name下有一个servlet-class,这个servlet-class对应的就是我后台提高服务的servlet,除此之外还有一个servlet-mapping,这个里边首先有一个servl-name。,这个servl-name首先要保证和上边的servlet-name保持一致,除此之外还有一个url-pattern,这是一个虚拟路径,是用来发送请求的url地址
二十五、bugfree的操作步骤
我们在使用bugfree的时候我们首先登陆的时候是以测试员的身份登陆的,也就是系统管理员用户;测试员在登陆后首先应该给要测试的项目的相关负责人,每人创建一个账号(也就是在登陆后的页面的后台管理中创建用户),用户都新建完成之后就新建组,把要测试的项目的用户添加到组中。最后就新建项目并且新建该项目的模块。新建完项目之后就是开始测试程序,在程序中遇到bug以后就把错误截图,在到bugfree中新建bug填写相关的信息和要指派的人(出错模块的负责人)和把刚才的错误截图作为附件一并传送过去。
开发人员每天早上上班的第一件事就是用自己的用户登录bugfree,然后输入查询条件看看前一天有没有指派给自己的bug需要解决的如果有就进行解决。
开发人员把对应的bug解决之后就去bugfree上把bug对应的状态改成已解决状态,然后进行保存提交,这样bug的状态就变成已解决状态。测试人员上线查看已解决状态的bug并再次进行测试,如果经过测试bug的问题已解决,就可以把bug关闭;如果经过测试,发现仍然存在bug,就把bug激活;这样等开发人员再次登录的时候就可以再次看到这个未解决的bug,再次进行解决,如此反复直到bug全部解决,因为bugfree对bug的修改都有保留,所有我们可以看到bug的一步步的完善,直到最后把bug关闭。
Bug的三种状态:未解决(Active)(测试人员)、已解决(Resolved)(开发人员)、关闭(Closed)(测试人员)
二十六、Axis2 的配置
axis2服务端配置流程
1.引入相关的jar包并且在web.xml中配置axis2的核心控制器 axisServlet
2.在web-inf下建立相关的三层文件夹结构:
services-->自定义文件夹名-->META-INF-->servies.xml
3.在servies.xml中配置service的name以及对应的springBeanName
4.在浏览器中输入webservice的服务端地址并加上?wsdl来进行测试,看
是否发布成功
axis2客户端配置流程
1.通过wsdl2java根据webservice服务端的url生成客户端代码
2.将代码引入项目的文件夹中进行正常访问
二十六、spring定时器
每隔固定的时间执行
1.建立一个triggers触发器集合
2.建立SimpleTriggerBean并且指定每次间隔的时间以及执行的次数以及要执行的目标
3.通过 targetObject以及targetMethod找到要执行的具体类的具体方法
目标对象是一个普通的java类
每到指定的时间执行
1.建立一个triggers触发器集合.
2.建立CronTriggerBean指定cron表达式以及要执行的目标
3.通过 targetObject以及targetMethod找到要执行的具体类的具体方法
目标对象是一个普通的java类
二十七、Ext概述
据我了解Ext是一个用js编写RIA框架,它可以和各种后台语言结合使用。
我在项目中用Ext来完成的模块大概情况是这个样子,首先我通过layout
等于border的这种方式来进行布局,分为上下左右中,然后在左边用ext
tree来进行菜单的展示,之后在中间区域通过tabs来加入选项卡,而在
选项卡中就是一个个的grid以及form,其中我在做grid的时候,首先通过
store来存取后台返回的符合model格式数据集,store是通过proxy和后台的
contoller进行交互,之后把store赋值给grid的store属性并且通过renderTO
在指定的位置进行渲染展示。
Grid问题:
当时我在做grid的时候,发现数据没有展示出来,
我通过f12进行跟踪,发现压根就没有发送请求,后来我分析了下,发现因为
没有调用store的loadPage方法,所以导致了这个问题。除此之外在我们做
项目的过程中,我手底下带的一个人同样在负责grid的时候,数据可以正常展示,但
分页信息没有展示,通过跟踪他的代码发现是因为他没有把store属性赋值给
分页工具条,所以才导致了这个问题。
tabs选项卡:
当我在做tab选项卡这一模块的时候,
我首先在加载页面的时候用TabPanel创建了一个
tab页面,让它展示在中间位置,
然后点击左边Tree菜单调用add方法动态添加一个个
的tab选项卡,但是做的过程中出现了相同的选项卡会重复添加的问题,
我查了一些相关资料,最后通过tab的id或者一个唯一标识判断tab是否选中,
如果选中则调用setActiveTab来激活该选项卡,让它选中,
否则就添加一个tab。
最后达到了tab不存在就添加,存在就选中的效果。
了解:
Ext4.0也支持前端的MVC开发模式.
为啥没采用mvc的开发模式?
我们当时因为时间方面的原因,项目经理就决定用普通的这种
开发模式进行开发,并没有采用Ext4.0这种mvc模式的特性。但
我认为他们的核心操作流程是一致的所以对我来说去学习和使用
这种方式并没有什么难度。
二十八、lucene的概述
lucene是一个全文检索引擎,在进行模糊匹配的时候,他可以
用来替代数据库中的like,从而在匹配准确性以及性能进行大幅度
的提高。我在做XX项目的XX模块的时候,就是用lucene来进行全文检索
用IK分词器来进行分词。从而实现了高亮显示关键词,分页,排序,
多字段,多条件的高性能搜索。在从数据中取数据生成索引的时候,
因为表中的数据量比较大,防止一次取出所导致内存溢出问题,我采用了
分段批量提取的方式进行,除此之外我们对后续增加的数据根据优先级的
不同采取不同的策略,对于那些需要及时显示的数据我们通过spring
定时器 在短时间内(30分钟)进行增量索引的生成,对于那些不需要
及时展示的数据,我们通过spring定时器在每天晚上凌晨的时候进行索
引的重新生成。
二十九、线程池作用
1.减少了创建和销毁线程的次数,
每个线程都可以被重复利用,
可执行多个任务。
2.可以根据系统的承受能力,
调整线程池中线程的数目,
防止因为消耗过多的内存,
而导致服务器宕机
(每个线程需要大约1MB内存,线程开的越多,
消耗的内存也就越大,最后宕机)。
通常我们使用的线程池是实现了ExecutorService的
ThreadPoolExecutor。
三十、jbpm是如何和spring进行整合
1.通过在spring-common.xml配置文件中配置springHelper,通过springHelper创建
processEngine,再通过processEngine获取各种工作流的Service,
如repositoryService,executionService,historyService,taskService
2.在src根目录下新建jbpm.cfg.xml文件
三十一、Tomcat优化
增大内存(堆,持久代)并开启server模式
我在做XXX项目时,用到了poi导入和导出数据,由于公司的业务比较繁多,数据量很大,测试时报内存溢出,经过我的分析再结合上网查阅资料,发现可能是tomcat内存不足,需要增大,修改配置文件后测试不再报错.
tomcat增大内存的方式通过修改tomcat配置文件
window下, 在bin/catalina.bat文件中最前面添加:
set JAVA_OPTS=-XX:PermSize=64M -XX:MaxPermSize=128m –Xms1024m -Xmx1024m
linux下,在catalina.sh最前面增加:
JAVA_OPTS="-XX:PermSize=64M -XX:MaxPermSize=128m –Xms1024m -Xmx1024m "
-client –service
当我们在cmd中运行-java时,黑窗口会出现-client -service这两参数.其作用是设置虚拟机运行模式;client模式启动比较快,但运行时性能和内存管理效率不如server模式,通常用于客户端应用程序。server模式启动比client慢,但可获得更高的运行性能。Windows默认为client,如果要使用server模式,就需要在启动虚拟机时加-server参数,以获得更高性能,对服务器端应用,推荐采用server模式,尤其是多个CPU的系统。在Linux,Solaris上,默认值为server模式.
JDK版本
影响虚拟机还有JDK的版本,JDK分为32位,64位两种版本,32位装在32位系统,64位系统可以装32位和64位JDK.64位JDK性能优于32位JDK.
测试的命令 java -xmx数值m –version 报错配置大小失败,反之成功
增加Tomcat最大连接数
使用场景
我在做完一个XXX项目后,测试时发现并发数量增加到一定程度就会很卡,于是我想到了是不是tomcat最大连接数设置有限制.果不其然,配置文件中最大值才500,于是我更改了最大连接数,根据业务我修改了连接数为2000,完美的解决了这个问题;
修改方法在conf/service.xml中默认值
<Connector port="8080" maxHttpHeaderSize="8192" maxThreads="1500"
minSpareThreads="30" maxSpareThreads="75" enableLookups="false"
redirectPort="8443" acceptCount="100" connectionTimeout="20000"
disableUploadTimeout="true" />,修改maxthreads的值即可
tomcat进行gzip压缩从而降低网络传输量
tomcat 压缩设置tomcat压缩gzip启用
HTTP 压缩可以大大提高浏览网站的速度,它的原理是,
在客户端请求服务器对应资源后,从服务器端将资源文件压缩,
再输出到客户端,由客户端的浏览器负责解压缩并浏览。
相对于普通的浏览过程HTML ,CSS,Javascript , Text ,
它可以节省60%左右的流量。更为重要的是,它可以对动态生成的,
包括CGI、PHP , JSP , ASP , Servlet,SHTML等输出的网页也能进行压缩,
压缩效率也很高。
启用tomcat的gzip压缩
要使用gzip压缩功能,你需要在Connector节点中加上如下属性
记住来源:http://www.qi788.com/info-42.html
compression="on" 打开压缩功能
compressionMinSize="50" 启用压缩的输出内容大小,默认为2KB
noCompressionUserAgents="gozilla, traviata" 对于以下的浏览器,不启用压缩
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" 哪些资源类型需要压缩
<Connector port="80" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" executor="tomcatThreadPool" URIEncoding="utf-8"
compression="on"
compressionMinSize="50" noCompressionUserAgents="gozilla, traviata"
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" />
三十二、memcached的介绍
memcached是一个用C语言开发的分布式的缓存,内部基于类似hashMap的结构。
它的优点是协议简单,内置内存存储,并且他的
分布式算法是在客户端完成的,不需要服务器端进行
通信,我们当时在做项目的时候因为考虑到项目
的高可用性高扩展性,因此在服务器部署方面采用
了apache+jk+tomcat这种负载均衡的方式,但是也带来了一个问题
就是session共享的问题,虽然可以通过session复制来解决这个
问题,但是在性能方面存在缺陷,所以最后我们采用了
用memcached来存储session,这样既解决了session共享
问题,也解决了session复制那种方式所产生的性能问题。
了解(不必主动说,但别人问的话一定要知道)
memcached是以KEY-VALUE的方式进行数据存储的,
KEY的大小限制:Key(max)<=250个字符;
VALUE在存储时有限制:Value(max)<= 1M;
根据最近最少使用原则删除对象即LRU.
memcached默认过期时间:ExpiresTime(max)= 30(days)
阅读全文
0 0
原创粉丝点击