重新探索自我

    客观条件受制于人,并不足惧。重要的是,我们拥有选择的自由,可以对现实环境积极回应,
    为生命负责,为自己创造有利的机会,做一个“真正”操之在我的人!

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  3 随笔 :: 10 文章 :: 5 评论 :: 0 Trackbacks

2006年10月17日 #

 

一、 General Techniques

1、  引数以 by value 方式而非 by reference 方式传递

2、  对于不变的 data object reference 使用 final ,final 仅仅令 object reference 自身成为不变量,但并不限制它所指向对象的改变

3、  缺省情况下,所有 non-static 都可以被覆写,不然 , 则用 final 防止覆写

4、  vector 容器包含的是对象,与 arrays 要区别,但我认为 Vector 的功能实际上有些像跟 Array List 差不多,只是 vector 现在不经常使用

5、  多态优于 instanceof ,只有在不得已的情况下使用

“如果你根据对象的型别来触发行为,那就改给自己一个耳光”

例如,当你必须从一个 base type 做向下转型为 derived type 的时候,必须使用它

….

Vector shapeVector = new Vector(10);

shapeVector.add(new Triangle());

shapeVector.add(new Triangle());

shapeVector.add(new Circle());

    //...

    //Assume many Triangles and Circles are added and removed

    //...

    int size = shapeVector.size();

    for (int i=0; i<size; i++)

    {

      Object o = shapeVector.get(i);

      if (o instanceof Triangle)

      {

        if (((Triangle)o).isRightTriangle())

        {

          //...

        }

      }

      else if (o instanceof Circle)

      {

        double rad = ((Circle)o).radius();

        //...

      }

}

         6 、一旦不需要对象的引用,就将它设为 null

       尽管有 GC, 你还是要关注的你的代码如何运用内存;

        

 

二、  对象与相等性

7 、区分 reference type primitive type ,理解他们的差异,你会在运用他们时候做出明智的

选择;

         Boolean(boolean)

         Character(char)

Byte(byte)

Integer(int)

Float(float)

Long(long)

Short(short)

Double(double)

基本型别相等,只要是值相等就可以拉,不管是不是同一类型;而引用类型必须则按照引用的比较方式来比较,譬如 equals();

 

8 java.lang.object 提供的 equals() 方法很多时候不是你想要的,你需要自己写一些比较的方法

public boolean equals(Object obj)

  {

 

    if (this == obj)

      return true;

 

    if (obj != null && getClass() == obj.getClass())

    {

      Golfball gb = (Golfball)obj;  //Classes are equal, downcast.

      if (brand.equals(gb.brand()) &&  //Compare attributes.

          make.equals(gb.make()) &&

          compression == gb.compression())

      {

        return true;

      }

    }

    return false;

  }

 

三、  java 异常

1、   try,cacth,finally

 

不要将 catch 的异常覆盖掉,在这样的情况下,我们要专门把异常保存下来,如用一个 vector 保存;

不要忽略任何一个异常,因为异常一旦出现,抛出异常的那个线程将会终止;

将一个异常加入到 throw 子句,会影响到调用它的所有函数

使用 finally 防止资源泄露,譬如在连接数据库的时候在 finally 中关闭连接;

不要从 try 字段中返回;

不要用 try catch 用于流程控制 ;

不要每逢出错的使用 try catch;

不要在构造函数中抛出异常;

抛出异常前,请将对象置为有效状态;

四、  性能

1、   先把焦点放在设计,数据机构和算法方面

2、   如果进行字符串的拼接,用 String Buffer String 快许多倍

3、   在面向对象中,对象的创建是昂贵的,因此需要将对象的创建成本降到最低,减少一些没有必要的对象,在非必要的时候,别产生你的对象

4、   将同步减少到最低,增加 stack 的使用

5、   使用基本型别代码会更快

6、   在使用 vector 时候,用 get() 来获取对象,而不是 Interator

7、   优先使用 array, 再考虑 ArrayList Vector ,如果不需要 vector 的同步特性,考虑使用 ArrayList

8、   尽可能的重复使用对象,这比重新创建对象更有效

9、   使用缓式评估,延迟计算,不必要的计算永远都不要计算

10、 手动优化你的代码,特别是执行的顺序

posted @ 2006-11-23 18:50 蒋利文 阅读(241) | 评论 (0)编辑 收藏

一、 简介

          Apache JMeter 100 %的 Java 桌面应用程序。用于对软件做压力测试(例如 Web 应用)。 它可以用于测试静态何动态资源例如静态文件、 Java 小服务程序、 CGI 脚本、 Java 对象、数据库, FTP 服务器 , 等等。 JMeter 可以用于对服务器、网络或对象模拟巨大的负载,来在不同压力类别下测试它们的强度和分析整体性能。

另外, JMeter 能够对应用程序做衰退测试,通过创建带有断言的脚本来验证你的程序返回了你期望的结果。为了最大限度的灵活性, JMeter 允许使用正则表达式创建断言。

将来开发的主要目标是使得 JMeter 尽可能地变成一个有用的衰退测试工具,而不损失 JMeter 地压力测试能力。

衰退测试:通过回归测试等方法来保证经过修改的代码没有衰退(质量下降)。

 

二、 安装与配置

JMeter 的安装过程非常简单:

第一步 安装 JDK (这里使用 JDK 1.5.0

第二步 下载 JMeter ,并解压

       官方下载地址: http://jakarta.apache.org/site/downloads/downloads_jmeter.cgi ,下载

jakarta-jmeter-2.2.zip 包,大小: 9.52M

第三步 配置环境变量

       JAVA_HOME = …

    JMeter = …

    CLASS_PATH=”%JAVA_HOME%\bin;%JAVA_HOME%\lib\tools.jar;%JMeter\bin%”

第四步 运行

       在命令行运行 jmeter.bat ,出现如下界面,说明安装成功:

 

三、 项目应用

1.       项目需求

模拟 5 个用户并发请求,每个用户请求两次(一次请求结束后,发出下一个请求),得出各个请求样本的响应时间,并得出一些统计性的数据。

2.       建立测试计划

首先,添加一个线程组,如下图:

用户并发数为 5 ,因为一个用户请求我们可以看作是一个请求线程,所以我们将线程数设置为 5 。这里设置休眠时间为 0 ,循环的次数为 2

其次,建立默认的 HTTP 连接属性,这样不用每次都重新输入参数,如下图:  

再次,建立要测试的 Http 请求,如下图

最后,建立查看结果形式,我们采用表格数据记录

   

       3 .运行测试脚本

              点击要测试的脚本,然后执行菜单运行 》开始,测试开始。

       4 .测试数据分析

              测试完成之后,数据如下:
      

聚合数据分析结果如下:

模拟 5 个用户并发访问 http://10.36.32.5:8080/wwwncsl/default.htm 页面,每个用户循环访问一次,总共 10 个样本数据。最大响应时间为 10.355s ,最短响应时间为 2.84s ,平均为 6.572s

90% 的可能集中在响应时间为 10.355s

posted @ 2006-11-23 18:37 蒋利文 阅读(1524) | 评论 (0)编辑 收藏


配置文件:
<Context path="/apple" docBase="D:\workspace\bolg\webdoc"
         privileged="true" antiResourceLocking="false" antiJARLocking="false">
 <Resource name="jdbc/blogdb" auth="Container"
    type="javax.sql.DataSource"
    maxActive="100" maxIdle="30" maxWait="10000"
    username="root" password=""
    driverClassName="com.mysql.jdbc.Driver"
    url="jdbc:mysql://localhost:3306/blogdb?autoReconnect=true"/>
</Context>

调用方式:
 Context ctx = null ;
 Connection conn = null;
 Statement stmt = null ;
 ResultSet rs = null;
 try{
  ctx = new InitialContext();
  if( ctx == null) throw new Exception("没有匹配的环境!");
  DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/blogdb");
  if( ds == null ) throw new Exception("没有匹配的数据库!");
  conn = ds.getConnection();
  stmt = conn.createStatement();
  rs = stmt.executeQuery(" select * from tbl_blog");
  while(rs.next()){
   out.print(rs.getString(2));
  }
  
 }catch(Exception e){
  e.printStackTrace();
 }finally{
  if(rs!=null) rs.close();
  if(stmt!=null) stmt.close();
  if(conn!=null) conn.close();
  if(ctx!=null) ctx.close();
 }



posted @ 2006-10-17 12:32 蒋利文 阅读(997) | 评论 (0)编辑 收藏