项目后期开发中的项目优化

原创 2013年12月04日 21:57:34

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1. 概述

本次的性能优化主要是针对windows平台开展优化。

建议:如果系统可以替换成64位的系统,最好安装64位系统。这样可以避免jdk在32位条件下的内存使用限制。

2. 系统运行环境

2.1. 应用系统环境

应用系统环境是指具体部署的应用的一些优化配置措施:

1、 检查proxool.xml配置

属性名

描述

初始值

最终值

house-keeping-sleep-time

保留线程处于睡眠状态的最长时间

90000

90000

simultaneous-build-throttle

可一次建立的最大连接数

10

200

prototype-count

连接池中可用的连接数量

5

5

maximum-connection-count

最大的数据库连接数

30

400

minimum-connection-count

最小的数据库连接数

10

10

 

2、 禁用平台提供的日志记录功能

 

 

 

3. tomcat应用服务器

1、tomcat启动参数优化,检查是否设置java_opts,参数是否起作用

2、对tomcat容器自身参数的优化,通过调整参数达到性能优化。

属性名

描述

初始值

最终值

maxThread

可创建的最大的线程数,每一个线程处理一个请求

 

 

minSpareThreads

最小备用线程数,tomcat启动时的初始化的线程数

 

 

maxSpareThread

最大备用线程数,一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程;

 

 

acceptCount

 指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,就是被排队的请求数,超过这个数的请求将拒绝连接

 

 

disableUploadTimeout

上传时是否使用超时机制

 

 

enableLookup

禁用反查域名,为了提高处理能力,应设置为false

 

 

 

connnectionTimeout 

网络连接超时,单位:毫秒。设置为0表示永不超时,这样设置有隐患的。通常可设置为30000毫秒

 

 

keepAliveTimeout 

长连接最大保持时间(毫秒)。此处为15秒

 

 

maxKeepAliveRequests

最大长连接个数(1表示禁用,-1表示不限制个数,默认100个。一般设置在100~200之间)

 

 

 

参考配置如下:

 

4. 前台代码优化

该步骤未优化到温州项目上,可以作为备选方案。

4.1. 压缩请求响应数据,节约网络带宽

前面介绍的压缩是去除脚本的注释和换行,这只是初步的压缩。而现在的主流浏览器都支持GZIP压缩,通过设置GZIP压缩,可以减小HTTP响应页面数据的大小可以节省HTTP响应时间。从HTTP/1.1开始,大部分浏览器都默认支持HTTP请求中有Accept-Encoding文件头的压缩格式,如:Accept-Encoding: GZIP, DEFAULT。如果服务器在请求的文件头中检测到上面的Accept-Encoding: GZIP,,就会以客户端列出的方式压缩响应传输的内容。然后Web服务器把压缩方式通过响应文件头中的Content-Encoding来返回给浏览器。GZIP大概可以减少70%的响应数据大小。GZIP可以对多种格式的数据进行压缩。

GZIP压缩的实现方式有多种,有些服务器支持GZIP压缩,可以通过简单的配置实现数据的压缩,也可以通过自己写一个过滤器,在web.xml注册,拦截响应的请求。

Ø 在tomcat服务器的server.xml文件中配置GZIP压缩

  <Connector port="8080" protocol="HTTP/1.1" 

   connectionTimeout="20000" 

   redirectPort="8443" URIEncoding="UTF-8"

   compression="on"    

   compressionMinSize="2048"   

   noCompressionUserAgents="gozilla,traviata"      compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain,application/json" />

Ø 下面简要介绍拦截器实现GZIP压缩,主要代码如下:

      /**

       * 判断浏览器是否支持GZIP

       * @param request

       * @return

       */

      private static boolean isGZipEncoding(HttpServletRequest request){

        boolean flag=false;

        String encoding=request.getHeader("Accept-Encoding");

        if(encoding!=null&&encoding.indexOf("gzip")!=-1){

          flag=true;

        }

        return flag;

      }

    /**

     * Gzip压缩过滤的实现方法

     */

    public void doFilter(ServletRequest request, ServletResponse response,

            FilterChain chain) throws IOException, ServletException {

        HttpServletResponse resp = (HttpServletResponse) response;

        HttpServletRequest req=(HttpServletRequest)request;

        //如果请求的浏览器支持压缩算法,则对response的数据进行压缩,否则不压缩

        if(isGZipEncoding(req)){

            Wrapper wrapper = new Wrapper(resp);

            chain.doFilter(request, wrapper);

//压缩响应的数据

            byte[] gzipData = gzip(wrapper.getResponseData());

            resp.addHeader("Content-Encoding""gzip");

            resp.setContentLength(gzipData.length);

            ServletOutputStream output = response.getOutputStream();

            output.write(gzipData);

            output.flush();

        } else {

            chain.doFilter(request, response);

        }        

 

    }

Web.xml配置如下:

<filter>  

  <filter-name>ecsideExport</filter-name>  

  <filter-class>com.linewell.ucap.filter.GZipFilter</filter-class>  

    </filter>  

    <filter-mapping>  

        <filter-name>ecsideExport</filter-name>  

        <url-pattern>*.jsp</url-pattern>  

    </filter-mapping> 

    <filter-mapping>  

        <filter-name>ecsideExport</filter-name>  

        <url-pattern>*.js</url-pattern>  

    </filter-mapping>

    <filter-mapping>  

        <filter-name>ecsideExport</filter-name>  

        <url-pattern>*.css</url-pattern>  

    </filter-mapping>

压缩的效果如下图:

 

5. java代码优化

5.1. 原理

1) 使用PreparedStatement代替Statement

Ø 推荐的写法:

 

Ø 不推荐的写法:

 

Ø 原因分析:

第一种方法使用的是预编译语句,每一种数据库都会尽最大努力对预编译语句提供最大的性能优化。因为预编译语句有可能被重复调用,所以数据库本身会对使用频繁的预编译语句进行缓存,下次调用时只要传入参数,预编译语句就能执行,而不需重新编译。而第二种方法,每次都需要对sql语句重新编译,然后才能执行。相比之下,显然第一种方法的效率更高。

ps:使用PreparedStatement还可以防止sql注入,提高应用程序的安全性。不过这不属于本次性能专题讨论的范畴,大家如果有兴趣可以自己深入学习。

 

5.2. 优化内容

1、 改造平台登录代码,把涉及的数据库查询操作修改为 PreparedStatement绑定变量的方式。

2、 修改首页加载涉及的查询代码。

3、 修改办件、事项、字典的常用查询语句。

 

6. 数据库优化

6.1. 概述

本次数据库优化主要从oracle参数、建立表索引、优化sql这个3个方面入手,优化主要流程如下:

1、 对应用进行压力测试

2、 查看压力测试后的oracle性能报告。

3、 根据性能报告调整优化基本参数,主要是sga,pga,process,session。

4、 梳理出需要优化的功能列表,然后找出涉及的sql语句,对语句进行优化。

5、 然后查找sql语句执行效率、占用cpu最差的语句、执行、读取磁盘和读取缓冲区的次数,进行优化。

6、 检查系统基础功能(用户、部门、权限、字典等)的表是否有建立主键和索引。

6.2. oracle基础

 

 

6.2.1. 查询当前用户连接数据库游标使用情况

 

select * from v$open_cursor t where t.USER_NAME in ('WZ_WAS','WZ_UCAP') -- and t.SQL_TEXT like 'SELECT * FROM UCAP_USER%'

 

select * from v$sql_shared_cursor t where t.SQL_ID='3nf9j2t694dv0'
select * from v$sql t where t.SQL_TEXT like 'SELECT * FROM UCAP_USER%'

 

select sql_id,child_number,sql_text,parse_calls,plan_hash_value,loads from v$sql t where t.SQL_TEXT like 'SELECT * FROM UCAP_USER%'

 

6.2.2. 检查占用CPU时间比较长的sql语句

select sql_text,cpu_time from v$sql where cpu_time >1e7 order by cpu_time

6.2.3. 查看sql语句执行、读取磁盘和读取缓冲区的次数

Select  SQL_TEXT,EXECUTIONS,DISK_READS,COMMAND_TYPE,OPTIMIZER_MODE, SHARABLE_MEM,BUFFER_GETS  from v$sqlarea ;

 

EXECUTIONS:执行次数 

  DISK_READS:读盘次数 

  COMMAND_TYPE:命令类型(3:select,2:insert;6:update;7delete;47:pl/sql程序单元) 

  OPTIMIZER_MODE:优化方式 

  SQL_TEXTSql语句 

  SHARABLE_MEM:占用shared pool的内存多少 

BUFFER_GETS:读取缓冲区的次数

 

http://klygit.iteye.com/blog/564098

6.2.4. 查看process,session的使用情况

 

SELECT   resource_name,
         current_utilization,
         max_utilization,
         LIMIT,
         ROUND (max_utilization / LIMIT * 100) || '%' rate
  FROM   (SELECT   resource_name,
                   current_utilization,
                   max_utilization,
                   TO_NUMBER (initial_allocation) LIMIT
            FROM   v$resource_limit
           WHERE   resource_name IN ('processes', 'sessions')
                   AND max_utilization > 0);

 

6.2.5. 执行效率最差的10sql语句

SELECT * FROM ( SELECT PARSING_USER_ID EXECUTIONS,SORTS, 

   COMMAND_TYPE, DISK_READS, sql_text FROM v$sqlarea 

   ORDER BY disk_reads DESC) WHERE ROWNUM<10 ;

6.2.6. 重建表空间的索引

create or replace procedure p_rebuild_all_index(tablespace_name in varchar2) as
  sqlt varchar(200);
begin
  for idx in (select index_name, tablespace_name, status
                from user_indexes
               where tablespace_name = tablespace_name
                 and status = 'VALID'
                 and temporary = 'N') loop
    begin
      sqlt := 'alter index ' || idx.index_name || ' rebuild ';
      dbms_output.put_line(idx.index_name);
      dbms_output.put_line(sqlt);
      EXECUTE IMMEDIATE sqlt;
    EXCEPTION
      WHEN OTHERS THEN
        dbms_output.put_line(SQLERRM);
    end;
  end loop;
end;

declare

tablespace_name varchar2(100);
begin
tablespace_name := 'was'; p_rebuild_all_index(tablespace_name);
end;

 

 

6.3. 优化内容

 

6.3.1. 创建索引

create index INDEX_ADVANCEINFO_RECEIVEDEPT on APAS_ADVANCEINFO (RECEIVE_DEPTUNID); 

create index INDEX_APAS_INFO_DEPTID on APAS_INFO (DEPTID);

create index INDEX_APAS_INFO_SERVICEID on APAS_INFO (SERVICEID);

 

create index INDEX_ADVANCEINFO_DEPTNAME on APAS_ADVANCEINFO (RECEIVE_DEPTNAME);

 

create index INDEX_APAS_INFO_RECEIVE_DEPTID on APAS_INFO (RECEIVE_DEPTID);

create index INDEX_ADVANCEINFO_CREATEUSERID on APAS_ADVANCEINFO (CREATEUSERID);

create index IDX_NODE_TRANS0 on UCAP_FW_FLOW_INSTANCE (INSTANCE_NODE_TRANSACTOR_0);

 

 

6.3.2. 修改视图配置

主要是在增加索引的列上,去除like的查询,如

 

AND RECEIVE_DEPTID like '%${RECEIVE_DEPTID}%'修改为

AND RECEIVE_DEPTID = '${RECEIVE_DEPTID}'  或者

AND RECEIVE_DEPTID like '${RECEIVE_DEPTID}%'

这样才能使用索引

所以如果发现其他视图中,有存在索引列上有like语句,请参看如上修改

 

对涉及的常用功能模块,检查视图配置。

6.3.3. 修改oracle参数

6.3.3.1. 调整 process,sessions参数

通过如下语句可以查看当前设置值和系统曾经达到的最高指。

SELECT   resource_name,
         current_utilization,
         max_utilization,
         LIMIT,
         ROUND (max_utilization / LIMIT * 100) || '%' rate
  FROM   (SELECT   resource_name,
                   current_utilization,
                   max_utilization,
                   TO_NUMBER (initial_allocation) LIMIT
            FROM   v$resource_limit
           WHERE   resource_name IN ('processes', 'sessions')
                   AND max_utilization > 0);

 

 

 

 

Oraclesessionsprocesses的关系是

sessions=1.1*processes + 5

 

步骤

alter system set processes=1000 scope = spfile;

 

alter system set sessions=1105;

 

重启数据库。

 

6.3.3.2. 调整oraclesga,pga大小

6.3.3.3. Sql优化

通过查找sql执行效率最差、读取磁盘最多,占用cpu最长的sql进行优化;主要优化的放心是查找该语句是否使用索引。

版权声明:本文为博主原创文章,未经博主允许不得转载。

浅谈连接池proxool配置

连接池是负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而再不是重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这...
  • czmchen
  • czmchen
  • 2009年11月10日 15:06
  • 1742

一连接池proxool问题解决

在使用连接池的时候,有时候会出现这个问题: Use of proxool.maximum-new-connections is deprecated. Use more descriptive pr...
  • hgsunyong
  • hgsunyong
  • 2013年12月20日 17:23
  • 1236

项目优化总结

最近一个多月算是比较忙的,但是具体忙了什么却不太好说清楚,主要是因为做的事比较繁琐还不太容易量化,说简单点,就是和组内其他几个同事一起接手一个算是开发好的项目,并进行一定的优化。 说到这个项目,就需...
  • tuzongxun
  • tuzongxun
  • 2016年11月23日 17:02
  • 1754

项目优化应该从那几个方面进行

首先一个项目的优化要从首页、数据库、等方面进行优化 前端: 1)压缩js/css文件,压缩文件,会将文件中的所有空格去掉,并且将复杂的变量名简单化。 2)在加载js/css文件时,我们需要将公共的js...
  • php_younger
  • php_younger
  • 2016年12月17日 10:25
  • 529

项目代码优化(三)

无效对象 场景 JSONObject total = new JSONObject(); 解释 英文 Dodgy - Dead store to local variableThis instruc...
  • u014344668
  • u014344668
  • 2017年04月26日 18:10
  • 1164

项目优化方案

1.程序开发优化 1.循代码编写约定及规范 1.2基础代码优化 1.2.1字符串优化 1.2.1.1使用StringBuffter代替String 例如: String s ="a...
  • shiyuezhong
  • shiyuezhong
  • 2012年12月29日 10:00
  • 6377

项目后期开发中的项目优化

1. 概述 本次的性能优化主要是针对windows平台开展优化。 建议:如果系统可以替换成64位的系统,最好安装64位系统。这样可以避免jdk在32位条件下的内存使用限制。 2. 系统运行环境 ...
  • zhuangjixiang
  • zhuangjixiang
  • 2013年12月04日 21:57
  • 3191

springmvc4+hibernate4整合框架的搭建,超详细哦

spring
  • baidu_23086307
  • baidu_23086307
  • 2016年09月16日 11:00
  • 4055

软件项目后期维护几点心得

软件项目后期维护几点心得         软件维护主要是指根据需求变化或硬件环境的变化对应用程序进行部分或全部的修改,修改时应充分利用源程序.修改后要填写程序改登记表,并在程序变更通知书上写明新旧程序...
  • qyzwangbin
  • qyzwangbin
  • 2010年03月24日 19:48
  • 2639

使用UE4开发VR项目_性能优化(三)_思路和方法

本文是《使用UE4开发VR项目-性能优化》的第三篇。希望能和您分享一下在UE4 VR项目优化的基本思路方法和技巧。   前篇请参考这里: http://gad.qq.com/article/det...
  • a359877454
  • a359877454
  • 2017年02月08日 15:02
  • 1402
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:项目后期开发中的项目优化
举报原因:
原因补充:

(最多只允许输入30个字)