数据加载中……

2009年1月23日

提高DB2 Web程序性能5条规则

在本文中,您将了解到使用Borland C#Builder和IBM DB2通用数据库(UDB)8.1开发快速Microsoft® ASP.NET Web应用程序的5条规则。

  速度和可升级性是网络开发重要的性能要求,而且它们也不难达到。应用一些简单的规则会提高网络应用的性能。分析Web应用程序的性能需要利用一些手段来检测每个操作的性能。为此,我创建了一个TimeDiff类(见程序清单1),它可以计算数据库操作的用时。你可以利用TimeDiff类的检测结果作为衡量数据库操作性能的基准,来观察哪些操作最为有效。我还创建了一个配合TimeDiff 类使用的LOTSOFRECORDS表(见程序清单2),它包含10,000条记录,你可以通过对它的操作来观察不同技术之间的性能差异。DB2具有内部缓冲池,一旦运行一个查询,内部缓冲池启用,因此二次查询的速度较快。在检测查询速度时,请忽略缓冲池启用前的结果而采用启用后的结果。

  程序清单1. TimeDiff类

  using System;

  namespace Effeciency
  {
   ///
   /// 这个类用于时间计算。在例子中,
   /// 我们将利用它检测数据库操作的速度,
   /// 以便作性能上的比较。
   ///
  public class TimeDiff
  {
   DateTime StartTime;
   DateTime EndTime;

   public TimeDiff() {}

   public void Start()
   {
   StartTime = DateTime.Now;
   }

   public void Stop()
   {
   EndTime = DateTime.Now;
   }

   public string TimeDifferenceText
   {
   get
   {
   TimeSpan TimeDifference = EndTime - StartTime;
   return TimeDifference.ToString();
   }
   }
  }
  }

  程序清单2. LOTSOFRECORDS的表定义

  CREATE TABLE "GLENN "."LOTSOFRECORDS" (
  "KEYCOL" INTEGER NOT NULL ,
  "COL1" CHAR(50) ,
  "COL2" CHAR(50) ,
  "COL3" CHAR(50) ,
  "COL4" CHAR(50) ,
  "COL5" CHAR(50) ,
  "COL6" CHAR(50) ,
  "COL7" CHAR(50) ,
  "COL8" CHAR(50) ,
"COL9" CHAR(50) ,
"COL10" CHAR(50) )
IN "USERSPACE1" ;
  COMMENT ON TABLE "GLENN "."LOTSOFRECORDS" IS 'Table designed to Contain Lots of Records';

  -- DDL Statements for primary key on Table "GLENN "."LOTSOFRECORDS"

  ALTER TABLE "GLENN "."LOTSOFRECORDS"
ADD CONSTRAINT "CC1058255334652" PRIMARY KEY
("KEYCOL");

  下面,我们就开始介绍这些提高DB2 UDB Web 应用程序性能的规则。我会先介绍提高数据库性能的基本规则,然后列出一些适合以Borland Data Provider开发ASP.NET应用时的性能规则。

  规则1:按需检索

  如果你只能记得住一条规则,那一定要记住这一条:按需检索。如果你是“幸存者”电视节目的忠实观众,您会记得其中的参赛者通过限额分配来保证每个人都有充足的食物。这种做法对于数据库开发同样适用。如果你的应用程序能够按需运行,那么就会合理地将数据库和网络资源留给其他应用。这听起来很简单,但我们还是来看一个例子。

  假设有一个包含10,000 行记录和10 个字段的表,以及一个需要显示所有记录但只显示3个字段的Web页。很多开发者经常图省事而使用"select *"语句选择所有的字段:

select * from GLENN.LOTSOFRECORDS

  这种做法应当避免,而应力求只检索需要的字段。可以在SQL 语句中定义要检索的字段,例如:

select KEYCOL, COL1, COL2, COL7
from
GLENN.LOTSOFRECORDS

  在本文附带的源程序中,有两个ASP.NET页面:一个是RetrievingAllFields.aspx,它执行第一个查询;另一个是RetrievingLimitedFields.aspx ,它执行第二个查询,即只检索需要的字段。

  用TimeDiff类进行检测,执行第一个查询用了1.622 秒,执行第二个查询用了1.311秒。后者用时只是前者的80%,不仅用时少,而且还减少了Web应用程序和数据库服务器之间的网络数据堵塞。

  这个例子只限制了检索的字段,你还可以使用WHERE语句限制检索的记录数。WHERE 语句可以限制服务器返回的记录数(见程序清单3)。要记住,通过网络发送的记录数据越少,对应用程序、数据库、用户和网络越有好处。

  规则2:优化数据库

  有时候你的Web应用程序可能运行得不错,但你想让它更好。一个简单的减少搜索时间的方法是为特定字段创建索引。如果有一个查询是要搜索某个价格范围内的产品(见程序清单3),但你没有为价格字段定义索引,那么返回数据就会多花一些时间。而一旦建立了索引,DB2会很快返回你想要的结果。

  程序清单3. 利用索引进行数据库搜索

  SELECT PRODUCTCODE, PRODUCTNAME, DESCRIPTION, UNITPRICE
  FROM
   GLENN.PRODUCTLIST
  WHERE
   UNITPRICE > 20.00

  优化数据库不只是为搜索字段创建索引这么一条,你应当尽可能多地搜集相关的DB2信息以使应用程序运行得更好。经常访问IBM发者园地(IBM DB2 Developer Domain)和comp.databases.ibm-db2(comp.databases.ibm-db2)等一些相关的Web站点或新闻组,对于保持DB2开发技巧不断更新是一个很好的办法。

  你还应当努力熟悉DB2附带的工具,例如DB2索引建议器(Index Advisor)。DB2索引建议器可以根据你递交的查询和所连接的数据库返回最佳索引列表。

posted @ 2009-01-23 11:10 余鹏 阅读(121) | 评论 (0)编辑 收藏

2009年1月22日

浅谈JPA

学习JPA——Hibernate Annotation使用实例

目前,JPA(Java Persistence API)的使用范围越来越广,作为Java EE 5.0平台标准的ORM规范,得到了诸如:Hibernate、TopLink、OpenJpa等ORM框架的支持,同时还是EJB 3.0的重要组成部分。JPA的宗旨是为POJO提供持久化标准规范。它能够脱离容器独立运行,方便开发和测试。本文将通过一个小实例来说明如何在Hibernate中使用JPA,来达到简化编程的目的。
开发环境 Eclipse 3.3.1 MyEclipse 6.0.1GA Tomcat 6.10 SQL Server 2000
hibernate-3.2.5.GA hibernate-annotations-3.3.0.GA
ejb3-persistence hibernate-commons-annotations-3.0.0.GA
本文是为后续的多种Ajax技术框架应用系列作一个前期准备,让大家先了解一下相比与以前的Hibernate ORM映射的不同之处,以及采用JPA所带来的好处。
为了保证程序能顺序运行,避免不同的Eclipse版本之间产生错误,大象强烈建议,下载源码后,按源码中的工程名,自己单独新建同一个工程,再将src和WEB-INF/lib目录下的所有文件COPY至对应的目录下。
1、创建Web Project
点击"File"->"New",选择"Web Project",在"Project Name"中输入ajax,点击"Finish"。下载本文后面需要用到的JAR包,加入到WEB-INF/lib目录下,在ajax工程中,文本采用的是UTF-8编码。
2、创建HibernateSessionFactory
传统的方法就是在工程名上点右键,选择”MyEclipse”->”Add Hibernate Capabilities”,然后就是按照提示一步一步做,不过在MyEclipse 6.0.1中添加Hibernate还是只能支持3.1,除非你选择” Add Spring Capabilities”,里面才有Hibernate 3.2的类库,要想完全兼容JPA,必须采用3.2以上版本。

这里大家直接使用源码中的HibernateSessionFactory,注意请先建包:com.ajax.core,HibernateSessionFactory中有一个地方需要改动,原来的写法是:
private static Configuration configuration = new Configuration(); 修改后为:
private static AnnotationConfiguration configuration = new AnnotationConfiguration(); 因为我们采用的是JPA注释方式来映射实体,另外AnnotationConfiguration这个类在hibernate-annotations.jar这个包中。
3、创建BaseDao
在com.ajax.core包下面新建BaseDao抽象类,里面定义的是持久化操作方法,有一点特别要注意,一定要在增加、删除、修改这几个方法中加入事务控制,不管是在BaseDao基类方法中加,还是在业务方法中加,一定要加事务控制,大象觉得在基类中加会比较好一点,这样做代码显得更少更简洁。如果不加事务控制,那么增、删、改这些操作都不会产生效果,因为默认情况下,它不会进行自动提交。在做这个例子的时候,这个问题曾经困扰了我好长时间。因此,请大家记住不要再犯和大象一样的错误!贴出部分代码,详情请看源码,里面有很全面的注释。
/**
* 抽象Dao类,用于持久化操作
* @author 菠萝大象
* @version 1.0
*/
public abstract class BaseDao {

private static Log log = LogFactory.getLog(BaseDao.class);

/**
* 获取Hibernate的Session对象
*/
public Session getSession(){
return HibernateSessionFactory.getSession();
}

/**
* 根据主键得到对象
*/
public T getObject(Class clazz, Serializable id){
return (T)getSession().get(clazz, id);
}

/**
* 保存对象
*/
public void saveObject(T t) {
Session session = getSession();
Transaction tx = beginTransaction(session);
try{
session.saveOrUpdate(t);
tx.commit();
}catch(Exception e){
tx.rollback();
log.error("保存对象失败");
}
}

/**
* 创建事务
*/
private Transaction beginTransaction(Session session){
return session.beginTransaction();
}
} 4、创建Employee
在com.ajax.employee.mode包下新建Employee类,这个就是POJO类,下面来详细说明里面的含义。
@Entity
@Table(name = "EMPLOYEE")
public class Employee implements java.io.Serializable{

private Integer employee_id; //人员ID(主键)
private String employee_name; //人员姓名
private String sex; //性别
private String birthday; //出生日期
private String address; //地址

@Id
@Column(name = "EMPLOYEE_ID")
@TableGenerator(
name="tab-store",
table="GENERATOR_TABLE",
pkColumnName = "G_KEY",
pkColumnValue="EMPLOYEE_PK",
valueColumnName = "G_VALUE",
allocationSize=1
)
@GeneratedValue(strategy = GenerationType.TABLE,generator="tab-store")
public Integer getEmployee_id() {
return employee_id;
}
public void setEmployee_id(Integer employee_id) {
this.employee_id = employee_id;
}
} 其它几个属性的getter和setter省略,这里我们要用到ejb3-persistence.jar,JPA的注解类就在这个包中,下面详细说明上面使用到的注解。
@Entity:通过@Entity注解将一个类声明为一个实体bean
@Table:通过 @Table注解可以为实体bean映射指定表,name属性表示实体所对应表的名称,如果没有定义 @Table,那么系统自动使用默认值:实体的类名(不带包名)
@Id:用于标记属性的主键
@Column:表示持久化属性所映射表中的字段,如果属性名与表中的字段名相同,则可以省略@Column注解,另外有两种方式标记,一是放在属性前,另一种是放在getter方法前,例如:
@Column(name = "EMPLOYEE_NAME")
private String employee_name; 或者
@Column(name = "EMPLOYEE_NAME")
public String getEmployee_name() {
return employee_name;
} 这两种方式都是正解的,根据个人喜好来选择。大象偏向于第二种,并且喜欢将属性名与字段名设成一样的,这样可以省掉@Column注解,使代码更简洁。
@TableGenerator:表生成器,将当前主键的值单独保存到一个数据库表中,主键的值每次都是从指定的表中查询来获得,这种生成主键的方式是很常用的。这种方法生成主键的策略可以适用于任何数据库,不必担心不同数据库不兼容造成的问题。大象推荐这种方式管理主键,很方便,集中式管理表的主键,而且更换数据库不会造成很大的问题。各属性含义如下:
name:表示该表主键生成策略的名称,这个名字可以自定义,它被引用在@GeneratedValue中设置的"generator"值中
table:表示表生成策略所持久化的表名,说简单点就是一个管理其它表主键的表,本例中,这个表名为GENERATOR_TABLE
pkColumnName:表生成器中的列名,用来存放其它表的主键键名,这个列名是与表中的字段对应的
pkColumnValue:实体表所对应到生成器表中的主键名,这个键名是可以自定义滴
valueColumnName:表生成器中的列名,实体表主键的下一个值,假设EMPLOYEE表中的EMPLOYEE_ID最大为2,那么此时,生成器表中与实体表主键对应的键名值则为3
allocationSize:表示每次主键值增加的大小,例如设置成1,则表示每次创建新记录后自动加1,默认为50

@GeneratedValue:定义主键生成策略,这里因为使用的是TableGenerator,所以,主键的生成策略为GenerationType.TABLE,生成主键策略的名称则为前面定义的”tab-store”。
这里大象想说下,网上有很多文章写的是strategy = GenerationType.AUTO或是strategy = GenerationType.SEQUENCE,采用SEQUENCE序列是因为Oracle数据中不支持identity自动增长,要想使用它,还得在数据库中创建一个序列,如果要更换数据库,那将是一个非常麻烦的事情。SEQUENCE生成方式我们暂且不谈,这里说下采用AUTO和IDENTITY的生成方式,本例采用的是SQL Server 2000作为数据库,所以如果想使用AUTO或是IDENTITY生成策略,则一定要对主键加上identity标识,如identity(1,1)。不过对于AUTO来说,是根据不同的数据库选择最合适的自增主键生成策略。如果使用MySQL,则主键要定义AUTO_INCREMENT,如果是Oracle,则要创建Sequence来实现自增。不管采用何种生成策略,增、删、改这些方法中一定要加入事务,否则数据是不会添加到数据库中滴~~~这是大象反复测试过的结果!
5、创建数据库及表
接下来,我们需要为本例创建一个数据库及必要的表。数据库名为ajax,表只有两个EMPLOYEE和GENERATOR_TABLE,下面是SQL脚本:
CREATE TABLE EMPLOYEE(
EMPLOYEE_ID int not null,
EMPLOYEE_NAME varchar (20) null,
SEX char (2) null,
BIRTHDAY varchar(10) null,
ADDRESS varchar(50) null,
CONSTRAINT PK_EMPLOYEE PRIMARY KEY (EMPLOYEE_ID)
)

CREATE TABLE GENERATOR_TABLE(
ID int not null,
G_KEY varchar(20) null,
G_VALUE int null,
CONSTRAINT PK_GENERATOR_TABLE PRIMARY KEY (ID)
)

INSERT INTO GENERATOR_TABLE VALUES(1,EMPLOYEE_PK,1) 如果你觉得麻烦,不想建库及表,可以将后面的数据库下载下来,然后还原数据库就可以了。
6、修改hibernate.cfg.xml
本例中,采用的是JTDS连接驱动,我们要对配置文件作一些设置,另外还要加入POJO类。
org.hibernate.dialect.SQLServerDialect
net.sourceforge.jtds.jdbc.Driver
jdbc:jtds:sqlserver://localhost:1433/ajax
sa
自己密码(无密码就空着)

以前没有使用JPA注解的时候,我们这里加入的都是hbm.xml文件,现在我们则加入的是类。
7、创建EmployeeManager
在com.ajax.employee.service下新建EmployeeManager类,这里面就是写业务方法,另外在这个类中添加一个main方法用于测试,将log4j的日志级别调整为DEBUG,这样我们就可以看到很详细的程序运行信息,源码中的注释很详细,这里就不贴出来了。
本例没有提供MySQL和Oracle数据库的脚本,不过这些应该很简单,按照最基本的方式建一个数据库和两张表就行了,这里附上两种数据库的hibernate配置。
MySQL:
org.hibernate.dialect.MySQLInnoDBDialect
com.mysql.jdbc.Driver
jdbc:mysql://localhost:3306/ajax
root
自己的密码(无密码就空着) Oracle:
org.hibernate.dialect.OracleDialect
oracle.jdbc.driver.OracleDriver
jdbc:oracle:thin:@127.0.0.1:1521:自己的SID
system
自己的密码(无密码就空着) 本文主要是从实用的角度来说明如何在Hibernate中使用JPA注释来简化开发,以及为后面的多种Ajax技术框架应用系列作一个前期准备。从这里可以看出,我们不需要再编写繁琐的hbm.xml文件。另外,JPA的功能很强大,这里只展示了其中的冰山一角,如果想深入学习JPA的话,请单独查找资料或购买相关书籍。
下面是本例中必须的JAR包
点击下载:antlr-2.7.6 asm-1.5.3 cglib-2.1.3 commons-collections-2.1.1 commons-lang-2.1
commons-logging-1.0.4 log4j-1.2.14 ehcache-1.2.3 ejb3-persistence-3.0
hibernate3-3.2.5 hibernate-annotations-3.3.0 hibernate-commons-annotations-3.0.0
mysql-connector.jar jtds.jar classes12.jar
点击下载:ajax_project db_ajax

posted @ 2009-01-22 17:27 余鹏 阅读(802) | 评论 (1)编辑 收藏
遍历两个日期之间天数的算法

package demo;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

/**
* 遍历两个日期之间天数的算法
*
*/
public class MyTest {
public static void main(String[] args) throws ParseException {
String start = "2007-01-27";
String end = "2008-03-04";
//字符串转换成日期
SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd");
Date startDate=format.parse(start);
Calendar startTime=Calendar.getInstance();
startTime.clear();
startTime.setTime(startDate);
int startYear = startTime.get(Calendar.YEAR);
int startMonth = startTime.get(Calendar.MONTH);
int startDay = startTime.get(Calendar.DAY_OF_MONTH);
Date endDate=format.parse(end);
Calendar endTime=Calendar.getInstance();
endTime.clear();
endTime.setTime(endDate);
int endYear = endTime.get(Calendar.YEAR);
int endMonth = endTime.get(Calendar.MONTH);
int endDay = endTime.get(Calendar.DAY_OF_MONTH);
System.out.println("注意西方的月份从0到11,中国的月份从1到12");
System.out.println("下面输入的是中国的日期.注意其中的转换问题");
System.out.println("start date : " + start);
System.out.println("end date : " + end);

int count = 0;
for (int x = startYear; x <= endYear; x++) {
//罗马历法产生年份公元1582年
int gregorianCutoverYear = 1582;
boolean isLeapYear = x >= gregorianCutoverYear ?
((x%4 == 0) && ((x%100 != 0) || (x%400 == 0))) :
(x%4 == 0);
//判断是否是闰年
//java方法
//boolean isLeapYear = (new GregorianCalendar()).isLeapYear(x);

String isBigYear = "是平年";
if (isLeapYear) {
isBigYear = "是闰年";
}
System.out.println(x + "年" + isBigYear);

//获取开始月的最大天数
//java方法
//SimpleDateFormat aFormat=new SimpleDateFormat("yyyy-MM-dd");
//Date date = aFormat.parse(start);
//Calendar time = Calendar.getInstance();
//time.clear();
//time.setTime(date);
//int max=time.getActualMaximum(Calendar.DAY_OF_MONTH); //本月份的天数
//System.out.println(max);

//获取开始月的最大天数;大月是1,3,5,7,8,10,12;小月是4,6,9,11;特殊月是2
int max = 0;
if (startMonth == 1) {
if (isLeapYear) {
max = 29;
}
if (!isLeapYear) {
max = 28;
}
}
if (startMonth == 3 || startMonth == 5 || startMonth == 8 || startMonth == 10) {
max = 30;
}
if (startMonth == 0 || startMonth == 2 || startMonth == 4 || startMonth == 6 || startMonth == 7 || startMonth == 9 || startMonth == 11) {
max = 31;
}

//循环每个月
//如果在日期范围内月份循环时自增到了一年的最后一个月就将月份初始化到一月份
int y = 0;
//如果是开始日期的第一个年的月数就从开始月数循环
if (x == startYear) {
y = startMonth;
}
for (; y < 12; y++) {

//获取当月的最大天数;大月是1,3,5,7,8,10,12;小月是4,6,9,11;特殊月是2
max = 0;
if (y == 1) {
if (isLeapYear) {
max = 29;
}
if (!isLeapYear) {
max = 28;
}
}
if (y == 3 || y == 5 || y == 8 || y == 10) {
max = 30;
}
if (y == 0 || y == 2 || y == 4 || y == 6 || y == 7 || y == 9 || y == 11) {
max = 31;
}

int ty = y + 1;
System.out.println(x + "年" + ty + "月");

//循环每一天
int z = 1;
//如果是开始日期的第一个月的天数就从开始天数循环
if (x == startYear && y == startMonth) {
z = startDay;
}
for (; z <= max; z++) {
count++;

System.out.println( x + "年" + ty + "月" + z + "日");

if (x == endYear && y == endMonth && z == endDay) {
break;
}
}


//如果已经遍历过了截至日期的最后月份就中止月份的循环
if (x == endYear && y == endMonth) {
break;
}

}
}

System.out.println(start + " 到 " + end + " 的天数差:" + count);

}

}

posted @ 2009-01-22 16:46 余鹏 阅读(1087) | 评论 (0)编辑 收藏
一个普通Java程序员的成长历程

很多网友问我学习Java有没有什么捷径,我说“无他,唯手熟尔”。但是我却很愿意将自己学习的一些经验写出来,以便后来者少走弯路,帮助别人是最大的快乐嘛!

  要想学好Java,首先要知道Java的大致分类。我们知道,自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。J2SE开发桌面应用软件比起VC,VB,DELPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。所以现在应用最广泛又最好学的就是J2EE了。J2EE又包括许多组件,如JSP,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。

  那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。然后你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢?还好,SUN提供了Javabean可以把你的JSP中的Java代码封装起来,便于调用也便于重用。接着就是EJB了,EJB就是Enterprise JavaBean,看名字好象它是Javabean,可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。至于JDBC,就不用我多说了,你如果用java编过存取数据库的程序,就应该很熟悉。还有,如果你要用Java编发送电子邮件的程序,你就得看看JavaMail了。

  好了,对Java和J2EE有了一些基本概念之后,你就应该编一些程序了,千万不要纸上谈兵哦。最好找一些有实例且带光盘的书来看,这样看到好的程序就可以直接Ctrl+C再Ctrl+V,也不用劳您老大架再亲自把它 再输一遍吧,再说直接复制还不用怕出错,何乐而不为呢!还有就是要经常上一些好的Java编程文章,有好的文章要Cut下来,有问题尽管问,只要问题不是太傻,一般高手都会回答你的。下面介绍几个好的Java方面的编程网站:CSDN论坛 http://www.csdn.net/ 中国最有名的技术论坛,《程序员》杂志就是他们出版的,你可以在上面提出问题,马上就有人回答你,如果你觉得好,你可以给那人加分;Java研究组织 http://www.javaresearch.org/ 上面有很多原创文章,高手还是挺多的;Java开发者 http://www.chinajavaworld.com/ 那里Java资料比较全;java.com.cn http://www.java.com.cn/ 看这域名就知道有多牛,注册用户快接近一万了,同时在线人数也在一千左右,人气很旺的;IBM的开发者网络 http://www-900.ibm.com/developerWorks/cn/java/index.shtml IBM永远的蓝色巨人。
  那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧!你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。所以你快去找一份Java的编程工作来做吧(如果是在校学生可以去做兼职啊),在实践中提高自己,那才是最快的。不过你得祈祷在公司里碰到一个高手,而且他还愿意不厌其烦地教你,这样好象有点难哦!

  还有一个办法就是读开放源码的程序了。我们知道开放源码大都出自高手,他们设计合理,考虑周到,再加上有广大的程序员参与,代码的价值自然是字字珠叽,铿锵有力(对不起,偶最近《金装四大才子》看多了)。学Java必读的两个开源程序就是Jive和Pet Store。

  Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本?J道。Jive(J道版)是由中国Java界大名鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站 http://www.jdon.com/ 去下载,或到同济技术论坛的服务器上 ftp://nro.shtdu.edu.cn 去下,安装上有什么问题,可以到论坛上去提问。

  Pet Store(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要错过了。
  你一定会高兴地说,哈哈,原来成为Java高手就这么简单啊!记得Tomjava也曾碰到过一个项目经理,号称Java很简单,只要三个月就可以学会。其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧,让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。

  关于设计模式的资料,还是向大家推荐banq的网站 http://www.jdon.com/ ,他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想)吧,现在很流行的Struts就是它的一种实现方式,不过Struts用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring(重整)和极限XP编程,相信你又会上一个台阶。

  做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧,你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全,接下项目来可以迅速作完,相信大家以后都会来找你的,所以Money就哗啦啦的来了.......

  当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢?
  下面介绍两个好的开源项目网站:
  湖北省软件公共开发平台 http://gro.clinux.org/
  共创联盟 http://cosoft.org.cn/
  哇,好高兴哦,我终于成为高手了!非也,非也。古人云:“识时务者为俊杰”。你知道计算机界现在的发展形势吗?你知道微软的.NET蓝图和SUN ONE计划之间的明争暗斗吗?你知道计算机技术将向何处发展吗?其实从各大计算机厂商最近的动作,都可以看出来“Web服务将是下一代互联网应用的制高点”,而微软的.NET蓝图和SUN ONE计划的斗争焦点,也就是Web服务。Web服务就是一个崭新的分布式计算模型,它是一系列标准的综合(XML,SOAP,UDDI,WSDL和WSFL等)。它使得不同语言编写的软件能够轻易的集成起来,使网络资源和Web站点变成一种服务而不是混乱的垃圾场。不远的将来,我们就可以在家里点击一下鼠标,就可以完成出门旅游的全部准备工作,包括定飞机票,定旅游线路,定好房间等。请注意,这所有的一切都是Web站点间自动完成的,再也不用象现在一样,表面上是电子商务,实际上很多环节都是人工操作。也许你会觉得这是天方夜谈,不过就近的说,你也很有可能承接一个项目,要集成两个企业的ERP系统。很有可能上游企业的系统是用Delphi编的,而下游企业的系统是用Java编的。你说你是Java高手,大家都看者你怎么做呢。所以啊,你还得学习新技术,如Web服务,而且你Delphi也要懂一点吧(Delphi6现在已经提供Web服务的控件了)。 你编的Java系统,可能要和.NET集成,所以你.NET要懂一点吧?到最后,你可能发现你已经成为Java高手了,但很多时间却在搞别的技术。太极张三丰里说,最厉害的招式就是没有招式,可能就是这个道理吧!

posted @ 2009-01-22 16:32 余鹏 阅读(149) | 评论 (0)编辑 收藏

2009年1月9日

哈哈!!

我的第一个博客!!!!!!!!!!!!!!!

posted @ 2009-01-09 10:04 余鹏 阅读(178) | 评论 (2)编辑 收藏
仅列出标题