fkjava

BlogJava 首页 新随笔 联系 聚合 管理
  49 Posts :: 0 Stories :: 0 Comments :: 0 Trackbacks

#

 

 

 首次接触到WebService,要调用一个发送短信的WebService里方法sendMQ,不废话,自己留个备份,也给需要的朋友,代码如下:

   

    Service service = new Service();

   

    String url = “http://xxxxx.xx.xx/yy.asmx”;

   

    //在浏览器中打开url,可以找到SOAPAction: http://www.chinsoft.com.cn/SendMQString namespace = http://www.chinsoft.com.cn/;String actionUri = SendMQ;

   

    //Action路径String op = SendMQ;

   

    //要调用的方法名Call call = Call service.createCall();call.setTargetEndpointAddressnew java.net.URLurl));call.setUsername(“your username”);

   

    // 用户名(如果需要验证)call.setPassword(“your password”);

   

    // 密码call.setUseSOAPActiontrue);call.setSOAPActionURInamespace + actionUri);

   

    // action uricall.setOperationNamenew QNamenamespace, op));

   

    // 设置要调用哪个方法

   

    // 设置参数名称,具体参照从浏览器中看到的call.addParameternew QNameinstance.NAMESPACE, sender”),

   

    XMLType.XSD_STRING, ParameterMode.IN);call.addParameternew QNameinstance.NAMESPACE, phoneNumber”),

   

    XMLType.XSD_STRING, ParameterMode.IN);call.addParameternew QNameinstance.NAMESPACE, content”),

   

    XMLType.XSD_STRING, ParameterMode.IN);call.addParameternew QNameinstance.NAMESPACE, sendTime”),

   

    XMLType.XSD_STRING, ParameterMode.IN);call.setReturnTypeorg.apache.axis.encoding.XMLType.XSD_STRING);

   

    // 要返回的数据类型String sendTime = 2011-07-14 13:05:32;Object[] params = new Object[] {xxx, 13223333333, “测试短信”, sendTime };String result = String call.invokeparams);

   

    //方法执行后的返回值

   

    以上代码用到的包:apache axis

   

    import javax.xml.namespace.QName;

   

    import javax.xml.rpc.ParameterMode;

   

    import javax.xml.rpc.encoding.XMLType;

   

    import org.apache.axis.client.Call;

   

    import org.apache.axis.client.Service;

   

希望帮助需要的朋友。

 

     您正在看的文章来自疯狂软件教育中心 www.fkjava.org

     信息咨询:Q564205990         星老师

 

posted @ 2012-08-14 15:48 疯狂软件 阅读(530) | 评论 (0)编辑 收藏

 

在一个jsp文件中,有三处地方定义了字符集,哪位兄弟,请帮忙解答一下如下问题!先谢了!

 

第一个问题:这三处定义字符集的作用分别是什么?

第二个问题:这三处定义字符集的异同点是什么?

第三个问题:这三个定义字符集的地方?在jsp文件都是必须要的吗?]

 

<!-- 1 -->

<%@ page language="java" contentType="text/html;charset=UTF-8" errorPage="error.jsp" %>

<!-- 2 -->

<%@ page pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

<head>

<!-- 3 -->

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>DispathTruck</title>

 

 

关于JSP页面中的pageEncodingcontentType两种属性的区别:

 

pageEncodingjsp文件本身的编码

 

contentTypecharset是指服务器发送给客户端时的内容编码

 

JSP要经过两次的“编码”,第一阶段会用pageEncoding,第二阶段会用utf-8utf-8,第三阶段就是由Tomcat出来的网页, 用的是contentType

 

第一阶段是jsp编译成.java,它会根据pageEncoding的设定读取jsp,结果是由指定的编码方案翻译成统一的UTF-8 JAVA源码(即.java),如果pageEncoding设定错了,或没有设定,出来的就是中文乱码。

 

第二阶段是由JAVACJAVA源码至java byteCode的编译,不论JSP编写时候用的是什么编码方案,经过这个阶段的结果全部是UTF-8encodingjava源码。

 

JAVACUTF-8encoding读取java源码,编译成UTF-8 encoding的二进制码(即.class),这是JVM对常数字串在二进制码(java encoding)内表达的规范。

 

第三阶段是Tomcat(或其的application container)载入和执行阶段二的来的JAVA二进制码,输出的结果,也就是在客户端见到的,这时隐藏在阶段一和阶段二的参数contentType就发挥了功效

 

contentType的設定.

 

pageEncoding contentType的预设都是 ISO8859-1. 而随便设定了其中一个, 另一个就跟着一样了(TOMCAT4.1.27是如此). 但这不是绝对的, 这要看各自JSPC的处理方式. pageEncoding不等于contentType, 更有利亚洲区的文字 CJKVJSP网页的开发和展示, (pageEncoding=GB2312 不等于 contentType=utf-8)

 

jsp文件不像.java.java在被编译器读入的时候默认采用的是操作系统所设定的locale所对应的编码,比如中国大陆就是GBK,台湾就是BIG5或者MS950。而一般我们不管是在记事本还是在ue中写代码,如果没有经过特别转码的话,写出来的都是本地编码格式的内容。所以编译器采用的方法刚好可以让虚拟机得到正确的资料。

 

但是jsp文件不是这样,它没有这个默认转码过程,但是指定了pageEncoding就可以实现正确转码了。

 

举个例子:

 

<%@ page contentType="text/html;charset=utf-8" %>

 

大都会打印出乱码,因为输入的“你好”是gbk的,但是服务器是否正确抓到“你好”不得而知。

 

但是如果更改为

 

<%@ page contentType="text/html;charset=utf-8" pageEncoding="GBK"%>

 

这样就服务器一定会是正确抓到“你好”了'

您正在看的文章来自疯狂软件教育中心 www.fkjava.org

信息咨询:Q564205990           星老师

posted @ 2012-08-12 17:30 疯狂软件 阅读(707) | 评论 (0)编辑 收藏

 

 1.oracle冷备份脚本:

    -- script:coldbak.sql

    -- creater:yangkai

    -- date:9.8.2012

    -- desc:offline full backup database

    --connect database

    connect system/zhangle;

    --shutdown database

    shutdown immediate;

    --Copy Data file

    $xcopy G:ORACLEPRODUCT10.2.0ORADATAYANGKAI*.DBF c: ebei;

    --Copy Control file

    $xcopy G:ORACLEPRODUCT10.2.0ORADATAYANGKAI*.CTL c: ebei;

    --Copy Log file

    $xcopy G:ORACLEPRODUCT10.2.0ORADATAYANGKAI*.LOG c: ebei;

    --startup database

    startup;

    2.sqlplus之后,start coldbak.sql即可。

    其中需要注意的是:

    !xcopy命令怎么用?加个“!”是不是指“!”符号后面的命令执行操作系统的命令。我一执行!xcopy命令splplus就报错说"sp2-0734未知命令开头“!xcopy c:--忽略剩于的行。"

    是因为:

    Windows下,不是!xcopy 而应该是 $xcopy,在SQL*Plus $表示执行操作系统命令。

    Linuxspl*plussvrmgrl下,是用!xcopy

    cms下是copy

    Linux下是cp

    host是通用的,如:

    SQL> host copy G:ORACLEPRODUCT10.2.0ORADATAYANGKAICONTROL02.CTL c: ebei;

    已复制 1 个文件。

SQL>'

 

     您正在看的文章来自疯狂软件教育中心 www.fkjava.org

     信息咨询:Q564205990           星老师

 

posted @ 2012-08-11 17:15 疯狂软件 阅读(660) | 评论 (0)编辑 收藏

多线程编程是现代软件技术中很重要的一个环节。要弄懂多线程,这就要牵涉到多进程?当然,要了解到多进程,就要涉及到操作系统。不过大家也不要紧张,听我慢慢道来。这其中的环节其实并不复杂。

(1)单CPU下的多线程

在没有出现多核CPU之前,我们的计算资源是唯一的。那么如果系统中有多个任务要处理的话,那么就需要按照某种规则依次调度这些任务进行处理。什么规则呢?可以是一些简单的调度方法,比如说

1)按照优先级调度

2)按照FIFO调度

3)按照时间片调度等等

当然,除了CPU资源之外,系统中还有一些其他的资源需要共享,比如说内存、文件、端口、socket等。既然前面说到系统中的资源是有限的,那么获取这些资源的最小单元体是什么呢,其实就是进程。

(2)多核CPU下的多线程

没有出现多核之前,我们的CPU实际上是按照某种规则对线程依次进行调度的。在某一个特定的时刻,CPU执行的还是某一个特定的线程。然而,现在有了多核CPU,一切变得不一样了,因为在某一时刻很有可能确实是n个任务在n个核上运行。我们可以编写一个简单的open mp测试一下,如果还是一个核,运行的时间就应该是一样的。

(3)多线程编程

为什么要多线程编程呢?这其中的原因很多,我们可以举例解决

1)有的是为了提高运行的速度,比如多核cpu下的多线程

2)有的是为了提高资源的利用率,比如在网络环境下下载资源时,时延常常很高,我们可以通过不同的thread从不同的地方获取资源,这样可以提高效率

3)有的为了提供更好的服务,比如说是服务器

4)其他需要多线程编程的地方等等

转自:疯狂软件

posted @ 2012-05-12 16:44 疯狂软件 阅读(136) | 评论 (0)编辑 收藏

软件架构是在软件需求出来之后,软件构建开始之前的工作,架构师应该确定的事情有:

1、程序组织

架构应该定义程序中的主要构造块。根据程序规模不同,各个构造块可能是单个类,也可能是由多个类组成的系统。每个构造块实现一个高层功能。并且每个需求都至少有一个构造块覆盖它。

定义各个构造块之间的通信规则和依赖规则

2、主要的类

架构应该详细定义或写出所用的主要的类。并指出该类如何与其他类交互。

架构不需要对所有类进行说明,使用82法则:对构成系统80%功能的20%类进行说明

3、数据设计

架构应该说明清楚用到的数据表的设计,并且描述为何做出这样的选择

4、业务规则

对特定的业务规则(比如:客户信息的更新时间不能超过30秒)要有架构方面的描述(比如30秒内对客户端进行信息同步)

5、用户界面设计

架构应该有详细的用户界面,好的用户界面直接关系到功能的实现和软件的最终效果

6、资源管理

架构应该对稀缺资源有管理计划。比如数据库连接,线程,句柄等的使用。有可能需要设计一个“资源管理器”的模块

7、安全性

架构应该描述用户据输入数据,cookie,配置文件等的安全性说明

8性能

应该根据需求文档中对性能的描述来提供估计的性能数据,并且说明为什么架构师相信能达到性能目的。或者为什么有的性能指标无法达到

9、可伸缩性

架构应该说明系统如何应对以后用户数量,服务器数量,网络节点数量,数据库记录数,数据库记录长度,交易量等增长的需求。

10、互用性

如果系统与其他软件或硬件有共享资源,架构应该说明如何完成这项功能

11、国际化/本地化

系统式是否支持国际化,如何在与用户交互的模块中实现国际化

12、输入输出

架构应该详细定义读取策略

13、错误处理

有人估计程序中高达90%的代码是用来处理异常和错误的,意味只有10%的代码是用来处理常规情况的。

14、容错性

容错是增强系统可靠性的技术,如果出现了错误是转入“部分运转”还是“功能退化”?

15、架构的可行性

架构师应该论证自己这个系统设计的可行性

16过度工程

即健壮性。架构应该指出哪些类哪些模块需要进行过度工程(健壮性测试),哪些类或模块只需要做出最简单的工作性能

17、关于买还是造

一些软件,开源代码,处理程序,是使用现货采购还是自己定制开发

18、关于复用

如果使用业界已经存在的软件,开源代码等资源,应该说明清楚如何对这些东西进行加工。

19、变更策略

架构应该清楚描述处理变更的策略。架构应该列出已经考虑过的可能会有变更的需求或者可能增强的功能。并提供处理情况,比如使用版本号进行控制,或者将代码设计成可动态添加新数据

20、架构的总体质量

架构应该清楚描述其做的所有主要决策的动机明确指出有风险的地方

转自:疯狂软件

posted @ 2012-05-12 16:43 疯狂软件 阅读(272) | 评论 (0)编辑 收藏

偶然在网上看到了这个有趣的问题,有人问:既然普遍认为编程是比较难的工作,为什么业务分析人员和项目经理们会拿比程序员更多的薪水?虽然大多数的时候程序员都被发现是最晚离开公司的人,可那些家伙的工作却能拿更多的报酬,为什么会这样?

回答的人很多,但似乎只有一个是比较合情合理的,它是从经济学原理的角度分析的这个问题。

人们所能获得的报酬往往会低于老板们的“最高标准”,而高于人们自己的“最低要求”。在这个范围内,你的实际收入依赖于你相对于你的老板的讨价还价的能力。

假设你给公司提供的服务价值每天1000美元。如果你用枪指着他,他会给你这个价格,因为他别无选择。如果你别无选择,你只能接受每天100美元水平。这是你的浮动范围。

假设你是一个新手,没有背景关系,不出名,你的老板是谷歌。谷歌有很强的讨价资本,它可以等待,去雇用其他人,很多人都想为它工作。你的资本很少,你需要付房租,所以你只能接受每天100多美元,而不是1000美元。

假设你是地球上最后一个会COBOL语言的程序员,而你的老板的主机上正跑着COBOL程序。那么,你拥有很强的讨价还价的资本,你将能得到接近每天1000美元的报酬。

所以,要么是你的项目经理或业务分析员对公司更有价值,要么就是他们有更多的讨价还价的资本。我并不认为是前一种情况,也就是说,应该是后一种情况。善于人际交往的人很少。这种事情也不能外包——因为他们需要接触客户。他们的相对稀缺给了他们更多讨价的资本,所以他们有了更高的报酬。

这个巧妙的回答来自NRM,尽管跟其它的各种和政治相关的解答比起来有点乏味,但它确实反映了实际情况。就像他提到的,善于交际的人稀少,这种人在任何公司都能来到巨大的好处,尤其是在软件开发领域。

转自疯狂软

posted @ 2012-05-11 16:59 疯狂软件 阅读(135) | 评论 (0)编辑 收藏

每次去IT社区,都在吐槽:说技术人员是多么的苦逼;每次和一些搞技术的朋友聚会,聊的也是大家的生活是多么的苦逼;每次上网看微博,也是充斥着“技术人员苦逼论”

今天谈到这个话题,固然会有很多的不同的意见和想法,我这里这是就从我看到的一些现象和自己的一些思考说说技术人员到底为什么“苦逼”。

为什么苦逼?

原因一大堆,对于外部的因数,我们很难控制,例如中国的IT国情和对技术人员的观念。但是,在商业中有这样一句话可以借鉴一下:经济再萧条,也有人在赚钱;形式再好,也有很多人在亏本,很多的公司在倒闭。

很多的时候,我们倒苦水,但是心里要知道:是大的环境让我们苦逼,还是我们本身就得苦逼,换句话说,苦逼是我们自己应得的。这话很多人不爱听,但是很多时候确是事实。

这半年多以来,去了不少大大小小的公司,为他们的项目进行救火,解决他们现有的性能等问题。很多的项目在做的时候,很少考虑什么性能,安全等因素,都是上面的人在不断的催,下面的人在火急火燎的加班加点赶进度—今天完成了什么功能点,明天要完成什么功能点。于是很多的技术人员顾不上什么,一心思的把功能堆了起来。苦逼的第一个原因出来了。

终于,项目搞定了,上线跑了没有多久,问题就出来了:项目功能是齐全,但是就是无法使用,有的功能慢的像拖牛。于是,有人建议开始买好的设备,加大带宽,以为钱砸下去了,情况会好点。但是好景不长,甚至事与愿违。于是一堆人就开始焦虑,束手无策,技术人员又开始加班加点的解决明明知道自己无法解决的问题,于是苦逼的第二个原因出来了。

在无法搞定的情况下,技术人员开始郁闷了,接着疯狂的上网开始收集可能的偏方,然后一股脑的用在项目中,求神拜佛的希望偏方有效果,运气好,暂时搞定了,那就皆大欢喜,搞不定,把之前的步骤再次重复一次吧。基本可以用下面的一个幽默来总结这个过程

从接触到的一些技术朋友来看,有些朋友的技术能力不错,有的却让我想抽自己,没有听错,是抽我自己。抽我自己为什么要给他们讲这么多的东西,而这些东西他们又不懂,然后又非得把懂这些知识的铺垫知识给他们讲。例如,项目出现了内存泄露的问题,公司的技术人员问题我这么回事,于是我告诉他们是VAS的碎片,他们又问我们为什么VAS碎片了,于是我们给他们讲述,但是他们听不懂,于是让我们给他们讲解一些铺垫知识:Window内存机制,.NET内存机制等。本来以为大家都是同行,交流交流,没想到,使得我们自己陷入了苦逼

同时也深深的感受的一点:很多的技术朋友在走出了校门或者培训学校之后,技术能力就没有在进步了,一是处于打混的阶段,有的运气好,很多年之后,混到了不错的职位,但是很多的人却混的非常不幸,于是他们就成为“技术人员苦逼论”的忠实粉丝。其中有一点就是很多的朋友不喜欢自学,总是希望有人手把手的教。我们遇到的一个最搞人的情况就是,我们已经把功能全部调完了,代码完全实现了,服务器也是全部配置好了,就差调试了,很多的人依然不动。

也使得我想起另外一个情况:每次有很多的朋友都说要学习技术内幕,要学深一点,喊着叫着要看深一点的文章,但是写出来之后,没有几个人真正的看完,前几篇简单的介绍看的人很多,稍微深一点,就没有人看了。也有很多的朋友想到处找大牛拜师,都希望沾点牛气,成为牛中的一员。但是技术,能力,这个东西终究靠自己。用心与不用心,差别就是天壤之别。

我常常说这样的话:社会不是初中,高中,没有人会像老师那样手把手的教你,盯着你,一切靠自己。没有谁就非得要叫你,没有人欠你的,如果自己都不上进,想做阿斗,诸葛亮来了也没用办法。物竞天择,适者生存!

我非常敬佩那些出身不好但是一直坚持奋斗的人,也非常敬仰那么环境舒适还依然努力的人。你遇到过很多聪明人,你的大学同学,你的同事,你的朋友,有几个比你傻?很多年以后,你会看到成功的并不是最聪明的人。因为决定成功的更多是非智力因素:明确的目标,积极的心态,努力和坚持,承受挫折和压力的能力,成熟的接人待物等等。有一种人注定没戏:不努力和怨天尤人。看到这里,技术人员为什么苦逼,可能各人心中有了答案。

转自疯狂软

posted @ 2012-05-11 16:58 疯狂软件 阅读(163) | 评论 (0)编辑 收藏

Java运行环境交互

SunJava提供了丰富的基础类库,Java SE提供了三千多个基础类(包括第7章介绍的集合框架),通过这些基础类库可以提高开发效率,降低开发难度。对于合格的Java程序员而言,至少要熟悉Java SE70%以上的类(当然,笔者并不是让读者去背诵Java API文档),但在反复查阅API文档的过程中,大脑会自动记住大部分类的功能、方法,因此程序员一定要多练,多敲代码。

    Java提供了StringStringBufferStringBuilder来处理字符串,它们之间存在少许差别,本章会详细介绍它们之间的差别,以及如何选择合适的字符串类。Java还提供了DateCalendar来处理日期、时间,其中Date是一个已经过时的API,通常推荐使用Calendar来处理日期、时间。

    正则表达式是一个强大的文本处理工具,通过正则表达式可以对文本内容查找、替换、分割等操作。从JDK1.4以后,Java也增加了对正则表达式的支持,包括新增的PatternMatcher两个类,并改写了String类,让String类增加了正则表达式支持,增加了正则表达式功能后的String类更加强大。

    Java还提供了非常简单的国际化支持,Java使用Locale对象封装一个国家、语言环境,再使用ResourceBundle根据Locale加载语言资源包,当ResourceBundle加载了指定Locale对应的语言资源文件后,ResourceBundle对象就可调用getString方法来取出指定key所对应的消息字符串。

与用户互动

    如果一个程序总是按既定的流程运行,无须处理用户动作,这个程序总是比较简单的。实际上,绝大部分程序都需要处理用户动作,包括接受用户的键盘输入、鼠标动作等。因为现在还未涉及图形用户接口(GUI)编程,故本节主要介绍程序如何获得用户的键盘输入。

运行Java程序的参数

回忆Java程序的入口:main方法的方法签名:

//Java程序入口:main方法

public static void main(String[] args){….}

    现在可以详细讲解main方法为什么采用这个方法签名:

    1public修饰符:Java类由JVM调用,为了让JVM可以自由调用这个main方法,所以使用public修饰符把这个方法暴露出来。

    2static修饰符:JVM调用这个主方法时,不可能先创建该主类的对象,然后通过对象来调用该主方法。JVM直接通过主类来调用主方法,因此使用static修饰该主方法。

    3void返回值:因为主方法被JVM调用,该方法的返回值将返回给 JVM,这没有任何意义,因此main方法没有返回值。

    上面方法中还包括一个字符串数组形参,根据前面介绍方法调用的规则:谁调用方法,谁负责为形参赋值。也就是说,main方法由JVM调用,即args形参应该由JVM负责赋值。但JVM怎么知道如何为args数组赋值呢?我们先看下面程序:

程序清单:codes/09/9- 1/TestArgs.java

public class TestArgs

{

public static void main(String[] args)

{

//输出args数组的长度

System.out.println(args.length);

//遍历args数组的每个元素

for(String arg:args)

{

System.out.pringln(arg);

}}}   

上面程序几乎是最简单的“HelloWorld”程序,只是这个程序增加了输出args数组的长度,遍历args数组元素的代码。使用java TestArgs命令运行上面程序,看到程序仅仅输出一个0,这表明args数组是一个长度为0的空数组—这是合理的:因为计算机是没有思考能力的,它只能忠实地执行用户交给它的任务,既然我们没有给args数组设定参数值,那么JVM就不知道args数组的元素,所以JVM以将args数组设置成一个长度为。的数组。

改为如下命令来运行上面程序:

java TestArgs Java Spring

看到如图9.1所示的运行结果:


9.1main方法的形参数组赋值

从图9.1中可以看出,如果运行Java程序时在类名后紧跟一个或多个字符串(多个字符串之间以空格隔开)JVM就会把这些字符串依次赋给args数组元素。运行Java程序时的参数与args数组之间的对应关系如图9.2所示:


9.2运行Java程序时参数和args数组的关系

如果某参数本身包含了空格,则应该将该参数用双引号(“)括起来,否则JVM会把这个空格当成参数分隔符,而不是当成参数本身。例如采用如下命令来运行上面程序:

 java TestArgs “Java Spring”

运行上面命令,看到args数组的长度是1,只有一个数组元素,其值是Java Spring

摘自《疯狂java讲义》

posted @ 2012-05-08 15:55 疯狂软件 阅读(235) | 评论 (0)编辑 收藏

 

EJB调用是耗时、费力的。怎么提高EJB的性能?我们为解决这一问题,开始边写边讨论。等到完成了,我才发现,我们所应用的技巧总结一下,竟有十条。把提高EJB性能的这些技巧总结一下,为以后的项目做参考。

1.用一个Session Bean封装多个Entity Bean,将原来的多个Entity BeanRemote调用和Local调用封装在一个Session Bean中。所以建立一个ServerFacade,它为多个对象提供统一获取EJB Home和获取对象的接口。ServerFacade为程序要用到的所有EJBhome handle提供缓存,提高访问JNDI Name的时间,达到提高访问效率的目的。以后查找JNDI Name的方法都应写在接口里,调用时直接从接口调用。

2.EJBRemote接口中使用粗粒度的方法,不推荐使用细粒度方法。

3.如果EJBRemote接口获取成功,应不再使用Remote接口,而是将Remote接口构造成一个一般的Java对象,通过调用一般的JAVA对象的方法来达到减少对网络的访问。

4.如果你部署EJB客户端和EJB在相同的JVM上,建设使用EJB2.0规范的Local接口代替Remote接口。

5."transient"关键字声明不必要的数据变量,替代以前的"public""private"等,避免不必要的数据变量占用网络资源。

6.ejb-jar.XML部署文件中,对Session Bean中非事务的方法,将trans-attribute属性赋为"NotSupported""Never"

7.设置事务的超时时间,在JBoss中,要修改${jboss.home}/server/${jboss.configuration}/conf/jboss-service.xml

8.当事务锁定数据库的行记录时,事务应跨越可能的最小的时间。

9.调整EJB 服务器的各种参数,如线程数、EJB池大小、连接池参数等。以在JBoss修改连接池参数为示例,进行说明。如果JBossMySQL相连,配置${jboss.home}/server/${jboss.configuration}/deploy/mysql-service.xml,来修改连接池参数,包括MinSizeMaxSizeBlockingTimeoutMillisIdleTimeoutMinutesCriteria等,各参数的含义如下所示:

1)MinSize :连接池保持的最小连接数。

2)MaxSize :连接池保持的最大连接数。

3)BlockingTimeoutMillis :抛出异常前最大的等待连接时间。

4)IdleTimeoutMinutes :关闭连接前连接空闲的最大时间。

5)Criteria :有ByContainerAndApplicationByContainerByApplicationByNothing等值。

10.对于数据库事务,应选择较低成本的事务等级,避免造成坏数据。递增成本的事务等级包括:

TRANSACTION_READ_UNCOMMITED,

TRANSACTION_READ_COMMITED,

TRANSACTION_REPEATABLE_READ,

TRANSACTION_SERIALIZABLE

转自疯狂软件

posted @ 2012-05-08 15:52 疯狂软件 阅读(118) | 评论 (0)编辑 收藏

Java内存管理的9个小技巧

以前很多人都说“Java完了,只等着衰亡吧!”,为什么呢?最简单的的例子就是Java做的系统时非常占内存!一听到这样的话,一定会有不少人站出来为Java辩护,并举出一堆的性能测试报告来证明这一点。其实从理论上来讲Java做的系统并不比其他语言开发出来的系统更占用内存,那么为什么却有这么多理由来证明它确实占内存呢?两个字,陋习。

1、别用new Boolean()。

在很多场景中Boolean类型是必须的,比如JDBCboolean类型的setget都是通过Boolean封装传递的,大部分ORM也是用Boolean来封装boolean类型的,比如

ps.setBoolean(“isClosed”,new Booleantrue));

ps.setBoolean(“isClosed”,new BooleanisClosed));

ps.setBoolean(“isClosed”,new Booleani==3));

通常这些系统中构造的Boolean实例的个数是相当多的,所以系统中充满了大量Boolean实例小对象,这是相当消耗内存的。Boolean类实际上只要两个实例就够了,一个true的实例,一个false的实例。Boolean类提供两了个静态变量:

public static final Boolean TRUE = new Booleantrue;

public static final Boolean FALSE = new Booleanfalse;

因为valueOf的内部实现是:return b TRUE FALSE;所以可以节省大量内存。相信如果Java规范直接把Boolean的构造函数规定成private,就再也不会出现这种情况了。

2、别用new Integer

Boolean类似,java开发中使用Integer封装int的场合也非常 多,并且通常用int表示的数值通常都非常小。SUN SDK中对Integer的实例化进行了优化,Integer类缓存了-128127256个状态的Integer,如果使用 Integer.valueOfint i),传入的int范围正好在此内,就返回静态实例。这样如果我们使用Integer.valueOf代替new Integer的话也将大大降低内存的占用。如果您的系统要在不同的SDK(比如IBM SDK)中使用的话,那么可以自己做了工具类封装一下,比如IntegerUtils.valueOf(),这样就可以在任何SDK中都可以使用这种特性。

3、用StringBuffer代替字符串相加。

这个我就不多讲了,因为已经被 人讲过N次了。我只想将一个不是笑话的笑话,我在看国内某“着名”java开发的WEB系统的源码中,竟然发现其中大量的使用字符串相加,一个拼装SQL 语句的方法中竟然最多构造了将近100string实例。无语中!

4、过滥使用哈希表

有一定开发经验的开发人员经常会使用hash表(hash 表在JDK中的一个实现就是HashMap)来缓存一些数据,从而提高系统的运行速度。比如使用HashMap缓存一些物料信息、人员信息等基础资料,这 在提高系统速度的同时也加大了系统的内存占用,特别是当缓存的资料比较多的时候。其实我们可以使用操作系统中的缓存的概念来解决这个问题,也就是给被缓存的分配一个一定大小的缓存容器,按照一定的算法淘汰不需要继续缓存的对象,这样一方面会因为进行了对象缓存而提高了系统的运行效率,同时由于缓存容器不是无限制扩大,从而也减少了系统的内存占用。现在有很多开源的缓存实现项目,比如ehcacheoscache等,这些项目都实现了FIFOMRU等常见的缓存算法。

5、避免过深的类层次结构和过深的方法调用。因为这两者都是非常占用内存的(特别是方法调用更是堆栈空间的消耗大户)。

6、变量只有在用到它的时候才定义和实例化。

7、尽量避免使用static变量,类内私有常量可以用final来代替。

8、对频繁使用的对象采用对象池技术

9、保证每个IO操作,connection及时关闭
转自:疯狂软件

posted @ 2012-05-04 11:58 疯狂软件 阅读(117) | 评论 (0)编辑 收藏

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