posts - 89, comments - 241, trackbacks - 0, articles - 1
   :: 首页 ::  :: 联系 :: 聚合  :: 管理

     摘要: 源代码以及下载  阅读全文

posted @ 2009-06-08 09:13 saobaolu| 编辑 收藏

     摘要: 小省小市小学校 大一小菜鸟的一个小小的课程设计  阅读全文

posted @ 2009-06-08 08:58 saobaolu| 编辑 收藏










 

posted @ 2009-05-30 21:40 saobaolu| 编辑 收藏

今日研究NetBeans欲完成课程设计学生管理系统,

突然发现不会连接数据库了……

思索中,用jsp的方法去test了一下,感觉……对啊,老师曾经讲过这个跟jsp链接数据库是一样的,巨汗…… =_=!

Class.forName………

con………..

stm………..

——运行——报错(ClassNotFoundException)——添加库MySQL-JDBC

应该没错了吧,但是……

SQLException: No suitable driver for mysql://localhost:3306/stu

而后发现了一个很耻辱的问题:

con = DriverManager.getConnection("mysql://localhost:3306/stu","×","×");

天啊,mysql://localhost:3306/stu,我竟然忘记写 jdbc在mysql前面!~~

 --------------------------------------------------------

中国移动老总上公厕,守门大爷说:进去3毛,出来2毛。
   老总一愣说:出来还收费?大爷说:学习移动,双向收费。
   老总从厕所出来又被拦住:你蹲的是8号坑,交1元钱的选号费,放了一个屁,交1元的漫游费,超过3分钟,再交1元的超时费。
   厕所有背景音乐,收彩铃费2毛。
   大爷劝老总,如果你经常光顾,还是办个厕所套餐比较合算。
   老总大怒:这是那家的王法!大爷一摆手:动感地带,我的地盘我做主!
   祝大家端午节开心

posted @ 2009-05-26 13:37 saobaolu| 编辑 收藏

Problem A: University

Time Limit: 1000MS
Memory Limit: 65536K

Total Submissions: 726
Accepted: 422

Description

企鹅大学有很多很多名学生,课程也很多。譬如企鹅语,北极熊语,企鹅初级数学,企鹅高级数学等等等等…… 现在,企鹅大学的校长想请你为他们写一个程序:计算总分的程序。请你由他们输入课程的数量以及一个学生每门课程的分数,输出该学生的总分。

Input

第一行:一个整数n(1 ≤ n ≤ 5000),代表企鹅大学的课程数目。
第2至第n+1行:每行有一个1整数,第i+1行代表某一位学生在第i门课上取得的分数。分数为0到100的整数。

Output

一个整数。代表该学生在n门课中所得的总分。

Sample Input

3
100
99
100

Sample Output

299
 

Problem B: Doudou

Time Limit: 1000MS
Memory Limit: 65536K

Total Submissions: 323
Accepted: 75

Description

有只企鹅叫豆豆,总是被别的企鹅欺负。豆豆在长期的隐忍之后,掌握了所有企鹅的高度和攻击力强度,还得到了一把黄金剑。在拥有了黄金剑以后,豆豆终于可以展开绝地大反击。但这把黄金剑的用法却很奇怪。

首先,豆豆第一次可以选择任何一只企鹅开始挑战。豆豆这一次必胜。

再次,当豆豆已经挑战过某一只企鹅后,再下一次的挑战对象只能是比上一名对手高,且比上一名对手攻击力强的企鹅。这样豆豆必胜。否则黄金剑会觉得打的没意思而故意发脾气输掉。豆豆还会被大家集体暴打。

面对着这把脾气很大的黄金剑,豆豆想请你帮助他计算一下,他最多可以连续击败多少只企鹅?

Input

第一行:一个数据n,代表企鹅群里除了豆豆一共有n(1 ≤ n ≤ 1000)只企鹅。
第2至第n+1行:每行2个数字。第i+1行的第一个数字为企鹅i的高度。第i+1行的第二个数字为企鹅i的攻击力。0 ≤ 高度,攻击力 ≤ 1,000,000。

Output

一个数。代表豆豆最多可以连续击败的企鹅数。

Sample Input


Sample Input #1
Sample Input #2


3
1 3
3 2
2 4
5
10 1
9 2
7 3
6 4
5 5

Sample Output


Sample Output #1
Sample Output #2


2
1

 

Problem C: Ball

Time Limit: 1000MS
Memory Limit: 65536K

Total Submissions: 6
Accepted: 0

Description

给出空间上两个运动的小球,球心坐标在分别是A(xa , ya , 0),B(xb , yb , 0),半径分别为Ra , Rb,速度分别为Va( vax, vay , 0), Vb( vbx , vby, 0)。判断两个小球是否会碰撞,若会碰撞, 输出首次碰撞时的时刻和两个小球的坐标;若不会碰撞,输出“Impossible”(球心和速度的z坐标恒为0,可将本题视为只是平面上的运动。初始时刻为0,若初始时刻小球贴在一起,视为首次碰撞)。

Input

第一行:一个整数T,(T ≤ 30),表示下面有T组数据。
接下来,每两行组成一组数据,首行包含5个实数,用空格隔开,依次是xa , ya , vax, vay , Ra,下面一行也包含5个实数,依次是xa , ya , vbx , vby, Rb。每组数据之间有一个空行。

Output

对于每组数据,如果两个小球会碰撞,输出首次碰撞时的时刻t,和两个小球的坐标xap , yap , xbp , ybp ,用空格隔开,保留三位小数。如果不能,输出“Impossible”。

Sample Input

3
100 200 0 0 55
100 100 0 0 45

131 123 45 2 43
454 230 0 -5 35

100 100 1 1 31
200 200 2 2 23

Sample Output

0.000 100.000 200.000 100.000 100.000
6.179 409.053 135.358 454.000 199.105
Impossible

 

Problem D: String

Time Limit: 1000MS
Memory Limit: 65536K

Total Submissions: 14
Accepted: 0

Description

给定一个字符串S[1..n]和一个整数T,现在需要在字符串S中找出长度不小于T的一个子串,使得其在原串中不重叠出现的次数最多,求这个次数。

Input

第一行:一个整数T(T > 1)
第二行:一个字符串S,且仅包含小写字母,字符串长度不超过10000

Output

一个整数。代表出现最多的次数

Sample Input

2
ababab

Sample Output

3

 

Problem E: Papercut

Time Limit: 1000MS
Memory Limit: 65536K

Total Submissions: 3
Accepted: 0

Description

现在桌面上有一张矩形纸,上边有n×m个格子,每个格子有一个数字。 每张矩形纸可以算出一个数值F,F是由纸张里任意两个不同的格子里的数字相乘之和。如果该纸只有一个格子,那么F=0。

剪纸规则是:
1、沿格子边缘一直剪成两个矩形纸,每张纸里必须有数字。
2、每次剪纸在桌面上任意选一张矩形纸,进行1操作,再把剪出来的两张纸放到桌面。

现在你可以对桌面上的纸最多剪k次,问最后桌面上所有矩形纸的F值之和最小是多少?

1 ≤ n ≤ 10
1 ≤ m ≤ 10
1 ≤ k ≤ 50

Input

第一行:3个整数n, m, k
接下来n行:每行m个正整数,范围在[1,10],第i行第j个数表示当前桌面那张矩形纸里边第i行第j个格子里的数字。

Output

一个整数。代表最小F值和。

Sample Input


Sample Input #1
Sample Input #2


4 4 4
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
 
10 10 5
4 2 3 5 6 10 1 6 5 8
3 6 9 1 7 10 7 10 8 1
7 8 3 3 2 5 9 9 8 2
5 5 9 9 3 10 2 9 10 2
1 1 6 7 6 8 3 9 6 8
7 1 2 5 3 2 3 7 8 10
10 9 8 9 7 8 10 7 3 9
6 3 6 2 1 7 10 6 7 2
2 4 8 4 5 9 10 5 9 10
7 4 3 2 4 9 9 9 8 1

Sample Output


Sample Output #1
Sample Output #2


18
26612

Hint

Sample 1说明: 按照下面方式剪纸4次
1   1   1   1
-------------
1 | 1 | 1 | 1
   |   |   |
1 | 1 | 1 | 1
   |   |   |
1 | 1 | 1 | 1
得到6+3+3+3+3=18

posted @ 2009-05-09 14:31 saobaolu| 编辑 收藏

<script language="javascript">
function checkForm(form){
    if(isEmpty(form.uid.value)||isEmpty(form.password.value)||isEmpty(form.confirmPassword.value)||isEmpty(form.email.value)||isEmpty(form.quesstion.value)||isEmpty(form.answer.value)||){
        alert("请将表单信息填写完整!");
        return false;
    }
    if(form.password.value!=form.confirmPassword.value){
        alert("两次密码不相同!");
        return false;
    }
    if(form.password.value.length<6||form.password.value.length>16){
        alert("密码长度不合法!");
        return false;
    }
    return true;
}
function isEmpty(str){
if(str=null||str.length==0)return true;
else return false;
}

</script>

扣错!

错在

if(isEmpty(form.uid.value)||isEmpty(form.password.value)||isEmpty(form.confirmPassword.value)||isEmpty(form.email.value)||isEmpty(form.quesstion.value)||isEmpty(form.answer.value)||){
这里错了:isEmpty(form.answer.value)||){

意思就是无论如何都是会返回一个true的!

怪不得我在form表单里添加这个函数没作用,哎,以后还是小心为好啊!

posted @ 2009-05-09 10:22 saobaolu| 编辑 收藏

ubuntu装好之后, 为浏览器firefox安装flash插件, 后来发现中文会变成方框。

如何解决?

输入:
cd /etc/fonts/conf.d/

为了安全,备份一下:

sudo cp 49-sansserif.conf 49-sansserif.conf_backup

输入如下指令:

sudo gedit ./49-sansserif.conf

此时文件显示内容。

将其中的第1、2、4个后面的sans-serif或者serif用你自己系统中支持中文的字体的名字代替,注意字体名字的大小写

比如:我的系统中安装了微软雅黑,我则用微软雅黑代替上述所说的字段,结果如下:

    <match target="pattern">
        <test qual="all" name="family" compare="not_eq">
            <string>宋体</string>
        </test>
        <test qual="all" name="family" compare="not_eq">
            <string>宋体</string>
        </test>
        <test qual="all" name="family" compare="not_eq">
            <string>monospace</string>
        </test>
        <edit name="family" mode="append_last">
            <string>宋体</string>
        </edit>
    </match>

posted @ 2009-05-06 07:28 saobaolu| 编辑 收藏

文件上传的时候,报错

 1Status 500 - 
 2
 3--------------------------------------------------------------------------------
 4
 5type Exception report
 6
 7message 
 8
 9description The server encountered an internal error () that prevented it from fulfilling this request.
10
11exception 
12
13org.apache.jasper.JasperException: An exception occurred processing JSP page /upload.jsp at line 302
14
15299:         if (!myFile.isMissing()) {
16300:             FileName=(String)date.Time_Stamp();
17301:             sOriginalFileName=myFile.getFileName();
18302:             myFile.saveAs("/"+sUploadDir+FileName+"."+myFile.getFileExt());
19303:             sSaveFileName=FileName+"."+myFile.getFileExt();
20304:             sPathFileName=sUploadDir+sSaveFileName;
21305:             System.out.println(sPathFileName);
22
23
24Stacktrace:
25    org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:505)
26    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:416)
27    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
28    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
29    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
30    sun.reflect.GeneratedMethodAccessor18.invoke(Unknown Source)
31    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
32    java.lang.reflect.Method.invoke(Method.java:597)
33    org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:244)
34    java.security.AccessController.doPrivileged(Native Method)
35    javax.security.auth.Subject.doAsPrivileged(Subject.java:517)
36    org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:276)
37    org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:162)
38
39
40root cause 
41
42java.security.AccessControlException: access denied (java.io.FilePermission \UploadFile read)
43    java.security.AccessControlContext.checkPermission(AccessControlContext.java:323)
44    java.security.AccessController.checkPermission(AccessController.java:546)
45    java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
46    java.lang.SecurityManager.checkRead(SecurityManager.java:871)
47    java.io.File.exists(File.java:731)
48    com.jspsmart.upload.SmartUpload.getPhysicalPath(SmartUpload.java:1067)
49    com.jspsmart.upload.File.saveAs(File.java:91)
50    com.jspsmart.upload.File.saveAs(File.java:65)
51    org.apache.jsp.upload_jsp._jspService(upload_jsp.java:376)
52    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
53    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
54    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
55    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
56    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
57    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
58    sun.reflect.GeneratedMethodAccessor18.invoke(Unknown Source)
59    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
60    java.lang.reflect.Method.invoke(Method.java:597)
61    org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:244)
62    java.security.AccessController.doPrivileged(Native Method)
63    javax.security.auth.Subject.doAsPrivileged(Subject.java:517)
64    org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:276)
65    org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:162)
66
67
68note The full stack trace of the root cause is available in the Apache Tomcat/6.0.18 logs.
69
70
71--------------------------------------------------------------------------------
72
73Apache Tomcat/6.0.18

正常上传tomcat的提示是:
gif|jpg|jpeg|bmp|GIF|JPG|JPEG|BMP500
UploadFile/20090505063838906.jpg
异常的时候是:
gif|jpg|jpeg|bmp|GIF|JPG|JPEG|BMP500
UploadFile/
苦恼中…………

posted @ 2009-05-05 19:13 saobaolu| 编辑 收藏

哎,说来真是点背,8.10升级到9.04之后因为显卡原因不能用,奈何从网上又down一个ubuntu9.04

运行wubi.exe,没有反应,运行,还没有反应,

while(see the article in cnbeta)

{

success;

break;

}

失败原因:盘符名中含有中文。
解决方法:将中文改为英文就可以了。如,原先为"系统盘(C:)",改为"system(C:)"。其他也是类似的改法。注意,所有的盘符都不可以含有中文!

可能是做wubi的程序员考虑欠周全所致,希望以后的版本不会再这样。
如果你已经双击了wubi,应先清除临时文件,路径为C:\Documents and Settings\Administrator\Local Settings\Temp(假设你的系统盘是C盘,并且是Administrator)。清除后,为了保险起见,重启后再运行wubi。

 

via cnbeta~

posted @ 2009-05-02 12:30 saobaolu| 编辑 收藏

Redwood Shores, CA - April 20, 2009

Oracle Corporation (NASDAQ: ORCL) and Sun Microsystems (NASDAQ: JAVA) announced today they have entered into a definitive agreement under which Oracle will acquire Sun common stock for $9.50 per share in cash. The transaction is valued at approximately $7.4 billion, or $5.6 billion net of Sun’s cash and debt. “We expect this acquisition to be accretive to Oracle’s earnings by at least 15 cents on a non-GAAP basis in the first full year after closing. We estimate that the acquired business will contribute over $1.5 billion to Oracle’s non-GAAP operating profit in the first year, increasing to over $2 billion in the second year. This would make the Sun acquisition more profitable in per share contribution in the first year than we had planned for the acquisitions of BEA, PeopleSoft and Siebel combined,” said Oracle President Safra Catz.

“The acquisition of Sun transforms the IT industry, combining best-in-class enterprise software and mission-critical computing systems,” said Oracle CEO Larry Ellison. “Oracle will be the only company that can engineer an integrated system – applications to disk – where all the pieces fit and work together so customers do not have to do it themselves. Our customers benefit as their systems integration costs go down while system performance, reliability and security go up.”

There are substantial long-term strategic customer advantages to Oracle owning two key Sun software assets: Java and Solaris. Java is one of the computer industry’s best-known brands and most widely deployed technologies, and it is the most important software Oracle has ever acquired. Oracle Fusion Middleware, Oracle’s fastest growing business, is built on top of Sun’s Java language and software. Oracle can now ensure continued innovation and investment in Java technology for the benefit of customers and the Java community.

The Sun Solaris operating system is the leading platform for the Oracle database, Oracle’s largest business, and has been for a long time. With the acquisition of Sun, Oracle can optimize the Oracle database for some of the unique, high-end features of Solaris. Oracle is as committed as ever to Linux and other open platforms and will continue to support and enhance our strong industry partnerships.

“Oracle and Sun have been industry pioneers and close partners for more than 20 years,” said Sun Chairman Scott McNealy. “This combination is a natural evolution of our relationship and will be an industry-defining event.”

“This is a fantastic day for Sun’s customers, developers, partners and employees across the globe, joining forces with the global leader in enterprise software to drive innovation and value across every aspect of the technology marketplace,” said Jonathan Schwartz, Sun’s CEO, “From the Java platform touching nearly every business system on earth, powering billions of consumers on mobile handsets and consumer electronics, to the convergence of storage, networking and computing driven by the Solaris operating system and Sun’s SPARC and x64 systems. Together with Oracle, we’ll drive the innovation pipeline to create compelling value to our customer base and the marketplace.”

“Sun is a pioneer in enterprise computing, and this combination recognizes the innovation and customer success the company has achieved. Our largest customers have been asking us to step up to a broader role to reduce complexity, risk and cost by delivering a highly optimized stack based on standards,” said Oracle President Charles Phillips. “This transaction will preserve and enhance investments made by our customers, while we continue to work with our partners to provide customers with choice.”

The Board of Directors of Sun Microsystems has unanimously approved the transaction. It is anticipated to close this summer, subject to Sun stockholder approval, certain regulatory approvals and customary closing conditions.

There will be a conference call today to discuss the transaction at 5:30 a.m. Pacific time. Investors can listen to the conference call by dialing (719) 234-7870, passcode 923645. A replay will be available for 24 hours after the call ends at (719) 884-8882, passcode: 923645. A live audio webcast of the call will be made available at www.oracle.com/investor and a replay will be available for seven days after the call ends.

About Sun Microsystems

Sun Microsystems, Inc. (NASDAQ: JAVA) develops the technologies that power the global marketplace. Guided by a singular vision -- "The Network is the Computer" -- Sun drives network participation through shared innovation, community development and open source leadership. Sun can be found in more than 100 countries and on the Web at http://www.sun.com.

About Oracle

Oracle (NASDAQ: ORCL) is the world's largest enterprise software company. For more information about Oracle, please visit our Web site at http://www.oracle.com.

Trademarks

Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.

Sun, Sun Microsystems, the Sun logo, Java, Solaris and the Network is the Computer are trademarks or registered trademarks of Sun Microsystems, Inc. or its subsidiaries in the United States and other countries

Cautionary Statement Regarding Forward-Looking Statements

This press release contains certain forward-looking statements about Oracle and Sun, including statements that involve risks and uncertainties concerning Oracle's proposed acquisition of Sun, anticipated product information, estimates of future results of operations and general business outlook. When used in this press release, the words "anticipates", “estimates”, "may", "can", “will”, "believes", "expects", "projects", "intends", "likely", similar expressions and any other statements that are not historical facts are intended to identify those assertions as forward-looking statements. Any such statement may be influenced by a variety of factors, many of which are beyond the control of Oracle or Sun, that could cause actual outcomes and results to be materially different from those projected, described, expressed or implied in this press release due to a number of risks and uncertainties. Potential risks and uncertainties include, among others, the possibility that the transaction will not close or that the closing may be delayed, the anticipated synergies of the combined companies may not be achieved after closing, the combined operations may not be successfully integrated in a timely manner, if at all, general economic conditions in regions in

which either company does business, and the possibility that Oracle or Sun may be adversely affected by other economic, business, and/or competitive factors. Accordingly, no assurances can be given that any of the events anticipated by the forward-looking statements will transpire or occur, or if any of them do so, what impact they will have on the results of operations or financial condition of Oracle or Sun.

In addition, please refer to the documents that Oracle and Sun, respectively, file with the Securities and Exchange Commission (the “SEC”) on Forms 10-K, 10-Q and 8-K. These filings identify and address other important factors that could cause Oracle's and Sun's respective financial and operational results to differ materially from those contained in the forward-looking statements set forth in this document. You are cautioned to not place undue reliance on forward-looking statements, which speak only as of the date of this report. Neither Oracle nor Sun is under any duty to update any of the information in this release.

Additional Information about the Merger and Where to Find It

In connection with the proposed merger, Sun will file a proxy statement with the SEC. Additionally, Sun and Oracle will file other relevant materials in connection with the proposed acquisition of Sun by Oracle pursuant to the terms of an Agreement and Plan of Merger by and among Oracle, Soda Acquisition Corporation, a wholly-owned subsidiary of Oracle, and Sun. The materials to be filed by Sun with the SEC may be obtained free of charge at the SEC's web site at www.sec.gov. Investors and security holders of Sun are urged to read the proxy statement and the other relevant materials when they become available before making any voting or investment decision with respect to the proposed merger because they will contain important information about the merger and the parties to the merger.

Oracle, Sun and their respective directors, executive officers and other members of its management and employees, under SEC rules, may be deemed to be participants in the solicitation of proxies of Sun stockholders in connection with the proposed merger. Investors and security holders may obtain more detailed information regarding the names, affiliations and interests of certain of Oracle's executive officers and directors in the solicitation by reading the proxy statement and other relevant materials filed with the SEC when they become available. Information concerning the interests of Sun's participants in the solicitation, which may, in some cases, be different than those of Sun's stockholders generally, is set forth in the materials filed with the SEC on Form 10-K and will be set forth in the proxy statement relating to the merger when it becomes available.

Contact Info

Karen Tillman
Oracle Corporate Communications
+1.650.607.0326
karen.tillman@oracle.com

Roy Lobo
Oracle Investor Relations
+1.650.506.4073
investor_us@oracle.com

posted @ 2009-04-21 18:08 saobaolu| 编辑 收藏

     摘要:   阅读全文

posted @ 2009-04-17 03:13 saobaolu| 编辑 收藏

http://mysql.ntu.edu.tw/Downloads/Connector-J/mysql-connector-java-5.0.8.zip

posted @ 2009-04-05 14:06 saobaolu| 编辑 收藏

  应用J2EE平台开发的系统的性能是系统使用者和开发者都关注的问题,本文从服务器端编程时应注意的几个方面讨论代码对性能的影响,并总结一些解决的建议。关键词:性能,Java,J2EE,EJB,Servlet,JDBC

一、概要

Java 2 Platform, Enterprise Edition (J2EE)是当前很多商业应用系统使用的开发平台,该技术提供了一个基于组件的方法来设计、开发、装配和部署企业级应用程序。J2EE平台提供了一个多层结构的分布式的应用程序模型,可以更快地开发和发布的新的应用解决方案。 

J2EE是一种技术规范,定义了整个标准的应用开发体系结构和一个部署环境,应用开发者开发时只要专注于具体商业逻辑和商业业务规则的实现上,而其他的诸如事务、持久化、安全等系统开发问题可以由应用程序容器或者服务器处理,开发完成后,就可以方便地部署到实现规范的应用服务器中。 

作为网络上的商业应用系统,同时访问的人数是很多的,在大量访问的情况下,过多的资源请求和有限的服务器资源(内存、CPU时间、网络带宽等)之间就会出现矛盾,应用系统的性能就显得很重要了,有时正确的代码并不能保证项目的成功,性能往往是最后决定一个项目是否成功关键。

本文主要从性能的角度出发,讨论J2EE服务器端的代码性能优化和提升。 

二、常见的Java 编程 J2EE语言基础是Java,常用的Java代码问题对应用系统的性能影响,

下面讨论了一些应该注意方面。 

使用StringBuffer代替String 当处理字符串的相加时,常见的写法是:

String str1 = "Hello";
String str2 = "welcome to world";
String str3 = str1 + ", " + str2 +"!";
System.out.println(str3);

很多人都知道,这样的代码效率是很低的,因为String是用来存储字符串常量的,如果要执行“+”的操作,系统会生成一些临时的对象,并对这些对象进行管理,造成不必要的开销。

  如果字符串有连接的操作,替代的做法是用StringBuffer类的append方法,它的缺省构造函数和append的实现是:

public StringBuffer() { // 构造函数
this(16); // 缺省容量16}

public synchronized StringBuffer append(String str) {
 if (str == null) {
  str = String.valueOf(str);
 }

 int len =str.length();
 int newcount = count + len;
 if(newcount > value.length)

 expandCapacity(newcount);

 // 扩充容量
 str.getChars(0, len, value, count);
 count = newcount;
 return this;
}

  当字符串的大小超过缺省16时,代码实现了容量的扩充,为了避免对象的重新扩展其容量,更好的写法为:

StringBuffer buffer = new StringBuffer(30);
// 分配指定的大小。
buffer.append("hello");
buffer.append(",");
buffer.append("welcometo world!");
String str = buffer.toString();

  ·生成对象时,分配合理的空间和大小

  Java中的很多类都有它的默认的空间分配大小,对于一些有大小的对象的初始化,应该预计对象的大小,然后使用进行初始化,上面的例子也说明了这个问题,StringBuffer创建时,我们指定了它的大小。

  另外的一个例子是Vector,当声明Vector vect=new Vector()时,系统调用:

public Vector() {// 缺省构造函数
 this(10); // 容量是 10;
}

  缺省分配10个对象大小容量。当执行add方法时,可以看到具体实现为:..

public synchronized boolean add(Object o) {
 modCount++;
 ensureCapacityHelper(elementCount+1);
 elementData[elementCount++] =o;

 return true;
}

private void ensureCapacityHelper(int minCapacity) {
 int oldCapacity = elementData.length;
 if (minCapacity > oldCapacity) {
  Object oldData[] = elementData;
  int newCapacity = (capacityIncrement > 0) ? (oldCapacity + capacityIncrement) :
(oldCapacity * 2);
  if (newCapacity < minCapacity) {
   newCapacity = minCapacity;
  }
  elementData = new Object[newCapacity];
  System.arraycopy(oldData, 0, elementData, 0, elementCount);
 }
}

  我们可以看到,当Vector大小超过原来的大小时,一些代码的目的就是为了做容量的扩充,在预先知道该Vector大小的话,可以指定其大小,避免容量扩充的开销,如知道Vector大小为100时,初始化是就可以象这样。

Vector vect =.. new Vector(100);

  ·优化循环体

  循环是比较重复运行的地方,如果循环次数很大,循环体内不好的代码对效率的影响就会被放大而变的突出。考虑下面的代码片:..

Vector vect = new Vector(1000);
...
for( inti=0; i<vect.size(); i++){
 ...
}

  for循环部分改写成:

int size = vect.size();
for( int i=0; i>size; i++){
 ...
}

  如果size=1000,就可以减少1000次size()的系统调用开销,避免了循环体重复调用。

  再看如下的代码片:..

for (int i = 0;i <100000;i++)
if (i%10 == 9) {
 ... // 每十次执行一次
}

  改写成也可以提高效率:..

for(inti =0,j =10; i<100000; i++,j--){
 if(j == 0){
  ... // 每十次执行一次
  j = 10;
 }
}

  所以,当有较大的循环时,应该检查循环内是否有效率不高的地方,寻找更优的方案加以改进。

  ·对象的创建

  尽量少用new来初始化一个类的实例,当一个对象是用new进行初始化时,其构造函数链的所有构造函数都被调用到,所以new操作符是很消耗系统资源的,new一个对象耗时往往是局部变量赋值耗时的上千倍。同时,当生成对象后,系统还要花时间进行垃圾回收和处理。

  当new创建对象不可避免时,注意避免多次的使用new初始化一个对象。

  尽量在使用时再创建该对象。如:

NewObject object = new NewObject();
int value;
if(i>0 )
{
 value =object.getValue();
}

  可以修改为:

int value;
if(i>0 )
{
 NewObject object = new NewObject();
 Value =object.getValue();
}

  另外,应该尽量重复使用一个对象,而不是声明新的同类对象。一个重用对象的方法是改变对象的值,如可以通过setValue之类的方法改变对象的变量达到重用的目的。

  ·变量的注意事项

  尽量使用局部变量,调用方法时传递的参数以及在调用中创建的临时变量都保存在栈(Stack) 中,速度较快。其他变量,如静态变量、实例变量等,都在堆(Heap)中创建,速度较慢。

  尽量使用静态变量,即加修饰符static,如果类中的变量不会随他的实例而变化,就可以定义为静态变量,从而使他所有的实例都共享这个变量。

  ·方法(Method)调用

  在Java中,一切都是对象,如果有方法(Method)调用,处理器先要检查该方法是属于哪个对象,该对象是否有效,对象属于什么类型,然后选择合适的方法并调用。

  可以减少方法的调用,同样一个方法:

public void CallMethod(int i ){
 if( i ==0 ){
  return;
 }
 ... // 其他处理
}

  如果直接调用,

int i = 0;
...
CallMethod(i);

  就不如写成:

int i = 0;
...

if( i ==0 ){
 CallMethod(i);
}

  不影响可读性等情况下,可以把几个小的方法合成一个大的方法。

  另外,在方法前加上final,private关键字有利于编译器的优化。

  ·慎用异常处理

  异常是Java的一种错误处理机制,对程序来说是非常有用的,但是异常对性能不利。抛出异常首先要创建一个新的对象,并进行相关的处理,造成系统的开销,所以异常应该用在错误处理的情况,不应该用来控制程序流程,流程尽量用while,if等处理。

  在不是很影响代码健壮性的前提下,可以把几个try/catch块合成一个。

  ·同步

  同步主要出现在多线程的情况,为多线程同时运行时提供对象数据安全的机制,多线程是比较复杂话题,应用多线程也是为了获得性能的提升,应该尽可能减少同步。

  另外,如果需要同步的地方,可以减少同步的代码段,如只同步某个方法或函数,而不是整个代码。

  ·使用Java系统API

  Java的API一般都做了性能的考虑,如果完成相同的功能,优先使用API而不是自己写的代码,如数组复制通常的代码如下:

int size = 1000;
String[] strArray1 = new String[size];
String[] strArray2 = new String[size];
for(inti=0;i<size;i++){ // 赋值
 strArray1[i] = (new String("Array: " + i));
}

for(inti=0;i<size;i++){ // 复制
 strArray2[i]=(new String((String)a[i]));
}

  如果使用Java提供的API,就可以提高性能:

int size = 1000;
String[] strArray1 = new String[size];
String[] strArray2 = new String[size];
for(inti=0;i<size;i++){ // 赋值
strArray1[i] = (new String("Array: " + i));
}

System.arraycopy(strArray1,0,strArray2,0,size); // 复制

  同样的一个规则是,当有大量数据的复制时,应该使用System.arraycopy()。
  三、I/O 性能

  输入/输出(I/O)包括很多方面,我们知道,进行I/O操作是很费系统资源的。程序中应该尽量少用I/O操作。使用时可以注意: . 合理控制输出函数System.out.println()对于大多时候是有用的,特别是系统调试的时候,但也会产生大量的信息出现在控制台和日志上,同时输出时,有序列化和同步的过程,造成了开销。

  特别是在发行版中,要合理的控制输出,可以在项目开发时,设计好一个Debug的工具类,在该类中可以实现输出开关,输出的级别,根据不同的情况进行不同的输出的控制。

  ·使用缓存

  读写内存要比读写文件要快很多,应尽可能使用缓冲。

  尽可能使用带有Buffer的类代替没有Buffer的类,如可以用BufferedReader 代替Reader,用BufferedWriter代替Writer来进行处理I/O操作。

  同样可以用BufferedInputStream代替InputStream都可以获得性能的提高。

  四、Servlet

  Servlet采用请求——响应模式提供Web服务,通过ServletResponse以及ServletRequest这两个对象来输出和接收用户传递的参数,在服务器端处理用户的请求,根据请求访问数据库、访问别的Servlet方法、调用EJB等等,然后将处理结果返回给客户端。

  ·尽量不使用同步

  Servlet是多线程的,以处理不同的请求,基于前面同步的分析,如果有太多的同步就失去了多线程的优势了。

  ·不用保存太多的信息在HttpSession中

  很多时候,存储一些对象在HttpSession中是有必要的,可以加快系统的开发,如网上商店系统会把购物车信息保存在该用户的Session中,但当存储大量的信息或是大的对象在会话中是有害的,特别是当系统中用户的访问量很大,对内存的需求就会很高。

  具体开发时,在这两者之间应作好权衡。

  ·清除Session

  通常情况,当达到设定的超时时间时,同时有些Session没有了活动,服务器会释放这些没有活动的Session,.. 不过这种情况下,特别是多用户并访时,系统内存要维护多个的无效Session。

  当用户退出时,应该手动释放,回收资源,实现如下:..

HttpSession theSession = request.getSession();
// 获取当前Session
if(theSession != null){
 theSession.invalidate(); // 使该Session失效
}

  五、EJB 问题

  EJB是Java服务器端服务框架的规范,软件厂商根据它来实现EJB服务器。应用程序开发者可以专注于支持应用所需的商业逻辑,而不用担心周围框架的实现问题。EJB规范详细地解释了一些最小但是必须的服务,如事务,安全和名字等。

  ·缓存Home接口

  EJB库使用Enterprise Bean 的客户端通过它的Home接口创建它的实例。客户端能通过JNDI访问它。服务器通过Lookup方法来获取。

  JNDI是个远程对象,通过RMI方式调用,对它的访问往往是比较费时的。所以,在设计时可以设计一个类专门用来缓存Home接口,在系统初始化时就获得需要的Home接口并缓存,以后的引用只要引用缓存即可。

  ·封装Entity Bean

  直接访问Entity Bean是个不好的习惯,用会话Bean封装对实体Bean的访问能够改进事务管理,因为每一个对get方法的直接调用将产生一个事务,容器将在每一个实体Bean的事务之后执行一个“Load-Store”.. 操作。

  最好在Session Bean中完成Entity Bean的封装,减少容器的事务处理,并在Session Bean中实现一些具体的业务方法。

  ·释放有状态的Session Bean

  相当于HttpSession,当把一个Session Bean设为Stateful,即有状态的Session Bean 后,应用容器(Container)就可能有“钝化”(Passivate)和活化(Activate)过程,即在主存和二级缓存之间对SessionBean进行存储位置的转移,在这个过程中,存在序列化过程。

  通常有状态Session Bean的释放是在超时时发生,容器自动的清除该对象,但是如果交给容器管理,一方面可能产生对象钝化,另一方面未超时期间,系统还要 维护一份该对象,所以如果我们确认使用完该StatefulSession Bean后不再需要时,可以显式的将其释放掉,方法是调用:

theSesionBean.remove();

  六、数据库访问

  在J2EE开发的应用系统中,数据库访问一般是个必备的环节。数据库用来存储业务数据,供应用程序访问。

  在Java技术的应用体系中,应用程序是通过JDBC(Java Database Connectivity)实现的接口来访问数据库的,JDBC支持“建立连接、SQL语句查询、处理结果”等基本功能。在应用JDBC接口访问数据库的过程中,只要根据规范来实现,就可以达到要求的功能。

  但是,有些时候进行数据查询的效率着实让开发人员不如所愿,明明根据规范编写的程序,运行效果却很差,造成整个系统的执行效率不高。

  ·使用速度快的JDBC驱动

  JDBC API包括两种实现接口形式,一种是纯Java实现的驱动,一种利用ODBC驱动和数据库客户端实现,具体有四种驱动模式并各有不同的应用范围,针对不同的应用开发要选择合适的JDBC驱动,在同一个应用系统中,如果选择不同的JDBC驱动,在效率上会有差别。

  例如,有一个企业应用系统,不要求支持不同厂商的数据库,这时就可以选择模式4的JDBC驱动,该驱动一般由数据库厂商实现的基于本地协议的驱动,直接调用数据库管理系统使用的协议,减少了模式3中的中间层。

  ·使用JDBC连接池

  为了提高访问数据库的性能,我们还可以使用JDBC 2.0的一些规范和特性,JDBC是占用资源的,在使用数据库连接时可以使用连接池Connection Pooling,避免频繁打开、关闭Connection。而我们知道,获取Connection是比较消耗系统资源的。

  Connection缓冲池是这样工作的:当一个应用程序关闭一个数据库连接时,这个连接并不真正释放而是被循环利用,建立连接是消耗较大的操作,循环利用连接可以显著的提高性能,因为可以减少新连接的建立。

  一个通过DataSource获取缓冲池获得连接,并连接到一个CustomerDB数据源的代码演示如下:

Context ctx = new InitialContext();
DataSource dataSource = (DataSource) ctx.lookup("jdbc/CustomerDB");
Connection conn = dataSource.getConnection("password","username");

  ·缓存DataSource

  一个DataSource对象代表一个实际的数据源。这个数据源可以是从关系数据库到表格形式的文件,完全依赖于它是怎样实现的,一个数据源对象注册到JNDI名字服务后,应用程序就可以从JNDI服务器上取得该对象,并使用之和数据源建立连接。

  通过上面的例子,我们知道DataSource是从连接池获得连接的一种方式,通过JNDI方式获得,是占用资源的。

  为了避免再次的JNDI调用,可以系统中缓存要使用的DataSource。

  ·关闭所有使用的资源

  系统一般是并发的系统,在每次申请和使用完资源后,应该释放供别人使用,数据库资源每个模式的含义可以参考SUN JDBC的文档,不同是比较宝贵的,使用完成后应该保证彻底的释放。

  请看下面的代码段:

Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
 DataSource dataSource = getDataSource();
 // 取的DataSource的方法,实现略。
 conn = datasource.getConnection();
 stmt = conn.createStatement();
 rs = stmt.executeQuery("SELECT * FROM ...");
 ... // 其他处理
 rs.close();
 stmt.close();
 conn.close();
}catch (SQLException ex) {
 ... // 错误处理
}

  粗看似乎没有什么问题,也有关闭相关如Connection等系统资源的代码,但当出现异常后,关闭资源的代码可能并不被执行,为保证资源的确实已被关闭,应该把资源关闭的代码放到finally块:

Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
 DataSource dataSource = getDataSource();
 // 取的DataSource的方法,实现略。
 conn = datasource.getConnection();
 stmt = conn.createStatement();
 rs = stmt.executeQuery("SELECT * FROM ...");

 ... // 其他处理
}catch (SQLException ex) {
 ... // 错误处理

}finally{
 if (rs!=null) {
  try {
   rs.close(); // 关闭ResultSet}
  catch (SQLException ex) {
   ... // 错误处理
  }
 }

 if (stmt!=null){
  try {
   stmt.close(); // 关闭Statement}
  catch (SQLException ex) {
   ... // 错误处理
  }
 }
 if (conn!=null){
  try {
   conn.close(); // 关闭Connection}
  catch (SQLException ex) {
   ... // 错误处理
  }
 }
}

  ·大型数据量处理

  当我们在读取诸如数据列表、报表等大量数据时,可以发现使用EJB的方法是非常慢的,这时可以使用直接访问数据库的方法,用SQL直接存取数据,从而消除EJB的经常开支(例如远程方法调用、事务管理和数据序列化,对象的构造等)。

  ·缓存经常使用的数据

  对于构建的业务系统,如果有些数据要经常要从数据库中读取,同时,这些数据又不经常变化,这些数据就可以在系统中缓存起来,使用时直接读取缓存,而不用频繁的访问数据库读取数据。

  缓存工作可以在系统初始化时一次性读取数据,特别是一些只读的数据,当数据更新时更新数据库内容,同时更新缓存的数据值。

  一个例子是,在一套企业应用系统中,企业的信息数据(如企业的名称)在多个业务应用模块中使用,这时就可以把这些数据缓存起来,需要时直接读取缓存的企业信息数据。

  七、总结

  一般意义上说,参与系统运行的代码都会对性能产生影响,实际应用中应该养成良好的编程规范、编写高质量的代码,当系统性能出现问题时,要找到主要影响性能的瓶颈所在,然后集中精力优化这些代码,能达到事半功倍的效果。

  J2EE性能的优化包括很多方面的,要达到一个性能优良的系统,除了关注代码之外,还应该根据系统实际的运行情况,从服务器软硬件环境、集群技术、系统构架设计、系统部署环境、数据结构、算法设计等方面综合考虑。

posted @ 2009-04-04 09:16 saobaolu| 编辑 收藏

     摘要: 第二种,JavaBean的形式。 package conn;                            //导入包 ...  阅读全文

posted @ 2009-04-03 17:07 saobaolu| 编辑 收藏

谷鸽鸟看,打造山寨信息网

谷歌金山词霸火星文版:http://g.iciba.com/mars/

posted @ 2009-04-01 18:14 saobaolu| 编辑 收藏

仅列出标题
共6页: 上一页 1 2 3 4 5 6 下一页