《java读书心得.doc》由会员分享,可在线阅读,更多相关《java读书心得.doc(82页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、java读书心得参加这次的java读书学习,规范是一个描述接口,语义以及web服务为了响应请求需要经常处理的工作的_ml文档。这将使简单地服务方便,快速地被描述和记录。下面是WTT为大家收集整理的java读书心得,欢迎大家阅读。java读书心得篇1首选很感谢Joshua Bloch写的这本书,当然更感谢我们的司令翻译。至少目前我看到的100页的内容,基本没发现翻译很别扭的地方,包括错别字也没有发现,至少没有影响到我对书中内容的理解。再次感谢。在后面的读书心得里,我会根据我的个人理解,将书中的各个知识点逐个和大家分享。 书中的一些观点我也不是完全赞同的,呵呵(估计是我的水平不够,呵呵呵)。我们先
2、看全书第一个问题:考虑用静态工厂方法代替构造器。也就是,不再使用 new 这种方式来获得一个类的实例,而是通过工厂方法获得。优点:1 有名字这个我体会还是比较深的,在JDK里,我见过一个类的最多的构造器数量,有16个。大家可以看看 Java.math.BigDecimal 这个类就知道了。就算一个类的构造器有4个左右,我想你很可能在使用的时候会极其注意,不要选错了到底是用哪一个。所以,如果能提供一个很好命名的方法来实现构造类,确实是一个不错的主意,比如BigDecimal.getInstanceFromString(.); 我想这个名字虽然有点垃圾,但要表达的意思确实异常的明确。在一些第三方的
3、库里面,这种情况更加突出。我许多时候不得不看看API文档,来区分我的那个int参数到底是使用三个参数的构造器,还是使用四个参数的构造器。因为他们太像了。2 可以单例这个就不用说了,你可以在方法里干你要做的任何事情,而new绝对会给你一个新的实例。3 可以返回任何子类型。这个对于系统的扩展是很有用处的。new 已经决定了你肯定要这个类,而静态方法却可以修改,不一定肯定返回你方法所在的类,可以在必要时替换为一个子类。4 代码简便这点我体会不深,呵呵不过这个写法我确实经常用List list = new ArrayList;后面的那个ArrayList里面的 String就是一个例子吧。不过我倒是不
4、是很在意这个,因为我很喜欢这样写了。下面这个例子看上去确实不错。呵呵!java view plain copypublic class Test e_tends Thread public static void main(String args) Test te = Test.newInstance;public static Test newInstance return new Test;java读书心得篇2最近我在慧桥上java的培训课,老师推荐了本不错的java教材Think in java 看书要学会做笔记,才会有更大收获,每天读30分钟,希望能坚持下去今天重新翻了第一章Intro
5、duction to object面向对象主要围绕的五个要点1.Everything is an object每个东西都可以看作一个对象,它储存了你所需要的必要信息,你可以通过特定的请求方式来向这个对象请求你所需要的东西2.A Program is a bunch of objects telling each other what to do by sending messages一个程序由很多对象组成,你可以向对象发送消息来告诉他们做什么和怎样做3.Each object has its own memory made up other objects你可以根据已经存在的对象来创建新的对象
6、,这应该就是对象的继承与重载吧4.Every object has a type每个对象都是类的一个实例,都有自己的特定的需要其完成其功能的数据类型5.All objects of a particular type can receive the same messages一个特定类型的所有对象能够获取同样的消息java读书心得篇3注:框架可以用word菜单中的 “视图/文档结构图” 看到j2ee模式value object(值对象) 用于把数据从某个对象/层传递到其他对象/层的任意java对象。通常不包含任何业务方法。也许设计有公共属性,或者提供可以获取属性值的get方法。jsp1.jsp
7、的基础知识_| directive (指令)| |- scripting (脚本)jsp -| |_action (动作)|_template data :除jsp语法外,jsp引擎不能解读的东西1)在jsp中使用的directive(指令)主要有三个:a) page指令b) include指令c) taglib指令在jsp的任何地方,以任何顺序,一个页面可以包含任意数量的page指令2)scripting(脚本)包括三种类型a) ;b) ;c) ;3)action(动作)标准的动作类型有:a) ;b) ;d) ;e) ;f) ;g) ;h) ; 日记日记300字value pair (来自于
8、deployment descriptor) servletconte_t接口封装了web应用程序的上下文概念。2.会话跟踪1) session 当一个client请求多个servlets时,一个session可以被多个servlet共享。 通常情况下,如果server detect到browser支持cookie,那么url就不会重写。2) cookie 在java servlet中,如果你光 cookie cookie = new cookie(name,value)那么当用户退出browser时,cookie会被删除掉,而不
9、会被存储在客户端的硬盘上。如果要存储 cookie,需加一句 cookie.setma_age(20_) cookie是跟某一个server相关的,运行在同一个server上的servlet共享一个cookie.3) url rewriting在使用url rewriting来维护session id的时候,每一次请求都需要encodeurl典型的用在两个地方1) out.print(“form action=” ”);out.print(response.encodeurl(“sessione_le”);out.print(“form action=” ”);out.prin
10、t(“method = get;”);2) out.print(“;out.print(response.encodeurl(“sessione_le?database=foo&;datavalue=bar”);out.println(“” ;url encoded ;”);3.singlethreadmodel默认的,每一个servlet definition in a container只有一个servlet class的实例。只有实现了singlethreadmodel,container才会让servlet有多个实例。servlet specification上建议,不要使
11、用synchronized,而使用singlethreadmodel。singlethreadmodel(没有方法)保证servlet在同一时刻只处理一个客户的请求。singlethreadmodel是耗费资的,特别是当有大量的请求发送给servlet时,singlethreadmodel的作用是使包容器以同步时钟的方式调用service方法。这等同于在servlet的service方法种使用synchronized.single thread model一般使用在需要响应一个heavy request的时候,比如是一个需要和数据库打交道的连接。2.在重载servlet地init( )方法后,
12、一定要记得调用super.init( );3.the client通过发送一个blank line表示它已经结束request而the server通过关闭the socket来表示response已结束了。4.一个 servlet可以送三种东西给client1) a single status code2) any number of headers3) a response body5.servlet之间信息共享的一个最简单的方法就是system.getproperties.put(“key”,”value”);6.post和getpost:将form内各字段名称和内容放置在 header
13、内传送给serverget: ?之后的查询字符串要使用urlencode,经过urlencode后,这个字符串不再带有空格,以后将在server上恢复所带有的空格。get是web上最经常使用的一种请求方法,每个超链接都使用这种方法。7.web._ml就是web applicatin 的deployment descriptor作用有:组织各类元素设置init param设置安全性8.request dispatcher用来把接收到的request forward processing到另一个servlet要在一个response里包含另一个servlet的output时,也要用到request
14、 dispatcher.9.servlet和jsp在同一个jvm中,可以通过serveltconte_t的setattribute( )getattribute( )removeattribute( )来共享对象10.利用request.getparameter( )得到的string存在字符集问题。可以用 strtitle = request.getparameter(“title”);strtitle = new string(strtitle.getbytes(“8859-1”),”gb2312”);如果你希望得到更大得兼容性string encoding = response.getc
15、haracterencoding;/确定application server用什么编码来读取输入的。strtitle = new string(strtitle.getbytes(encoding),”gb2312”);_ml1._ml基础知识1.一个_ml文档可以分成两个基本部分:首部( header )内容( content )2._ml名字空间规范中指定:_ml文档中的每一个元素都处在一个名字空间中;如果没有指定的名字空间,缺省的名字空间就是和该元素相关联的名字空间。3.a document that is well-formed obeys all of the rules of _m
16、l documents (nested tags, etc.)“ if a well-formed document uses a document type definition (more on these in a minute), and it follows all the rules of the dtd, then it is also a valid document4.a tag is the te_t between the ;” an element is the start tag, the end tag,and everything (including other
17、 elements) in between5.标签( tags ) 实际上包含了“元素”( elements ) 和 “属性”( attributes )两部分。用元素( elements )来描述有规律的数据。用属性( attributes ) 来描述系统数据。如果你有一些数据要提供给某个应用程序,该数据就可能要用到一个元素。如果该数据用于分类,或者用于告知应用程序如何处理某部分数据,或者该数据从来没有直接对客户程序公开,那么它就可能成为一种属性。6.cdata (读作:c data ) c是character的缩写。7.org._ml.sa_.reader/|org._m.l.sa_._m
18、lreader/|org.apche._erces.parsers.sa_parser2.webservice2.1 webservice的基本概念webservice是一种可以接收从inter或者intra上的其它系统中传递过来的请求,轻量级的独立的通讯技术。这种技术允许网络上的所有系统进行交互。随着技术的发展,一个web服务可以包含额外的指定功能并且可以在多个b2b应用中协作通讯。web服务可以理解请求中上下文的关系,并且在每一个特定的情况下产生动态的结果。这些服务会根据用户的身份,地点以及产生请求的原因来改变不同的处理,用以产生一个唯一的,定制的方案。这种协作机制对那些只对最终结果有兴趣
19、的用户来说,是完全透明的。uddi在用户能够调用web服务之前,必须确定这个服务内包含哪些商务方法,找到被调用的接口定义,还要在服务端来编制软件。所以,我们需要一种方法来发布我们的web服务。uddi (universal description, discovery, and integration) 是一个主要针对web服务供应商和使用者的新项目。uddi 项目中的成员可以通过uddi business registry (ubr) 来操作web服务的调用,ubr是一个全球性的服务。web服务供应商可以在ubr中描述并且注册他们的服务。用户可以在ubr中查找并定位那些他们需要的服务。udd
20、i是一种根据描述文档来引导系统查找相应服务的机制。uddi包含标准的“白皮书”类型的商业查询方式,“黄皮书”类型的局部查找,以及“绿皮书”类型的服务类型查找。uddi利用soap消息机制(标准的_ml/)来发布,编辑,浏览以及查找注册信息。它采用_ml格式来封装各种不同类型的数据,并且发送到注册中心或者由注册中心来返回需要的数据。wsdl对于商业用户来说,要找到一个自己需要使用的服务,他必须知道如何来调用。wsdl (web services description language) 规范是一个描述接口,语义以及web服务为了响应请求需要经常处理的工作的_ml文档。这将使简单地服务方便,快速
21、地被描述和记录。以下是一个wsdl的样例:targetnamespace=“stocke.wsdl”_mlns:tns=“stocke.wsdl” (5)(6)(7)(8)(9)(10)(11)(12)(13)(14)(15)_mlns:_sd1=“stocke._sd”_mlns:soap=“wsdl/soap/”_mlns=“wsdl/”;_mlns=“_/10/_mlschema”;type=“tns:stockeporttype”;transport=“soap/”/;soapaction=“getlasttradeprice”/;my first service;它包含了以下的关键信
22、息:消息的描述和格式定义可以通过_ml文档中的;和; 标记来传送。; 标记中表示了消息传送机制。 (e.g.request-only, request-response, response-only) 。; 标记指定了编码的规范 。; 标记中表示服务所处的位置 (url)。wsdl在uddi中总是作为一个接口描述文档。因为uddi是一个通用的用来注册wsdl规范的地方,uddi的规范并不限制任何类型或者格式描述文档。这些文档可能是一个wsdl文档,或者是一个正规的包含导向文档的web页面,也可能只是一个包含联系信息的电子邮件地址。现在java提供了一个 java api for wsdl (j
23、wsdl)规范。它提供了一套能快速处理wsdl文档的方法,并且不用直接对_ml文档进行操作,它会比ja_p更方便,更快速。soap当商业用户通过uddi找到你的wsdl描述文档后,他通过可以simple object access protocol (soap) 调用你建立的web服务中的一个或多个操作。soap是_ml文档形式的调用商业方法的规范,它可以支持不同的底层接口,象(s)或者smtp。之所以使用_ml是因为它的独立于编程语言,良好的可扩展性以及强大的工业支持。之所以使用是因为几乎所有的网络系统都可以用这种协议来通信,由于它是一种简单协议,所以可以与任何系统结合,还有一个原因就是它可
24、以利用80端口来穿越过防火墙。soap的强大是因为它简单。soap是一种轻量级的,非常容易理解的技术,并且很容易实现。它有工业支持,可以从各主要的电子商务平台供应商那里获得。从技术角度来看,soap详细指明了如何响应不同的请求以及如何对参数编码。一个soap封装了可选的头信息和正文,并且通常使用 post方法来传送到一个 服务器,当然其他方法也是可以的,例如smtp。soap同时支持消息传送和远程过程调用。以下是一个soap请求。post /stocke /1.1host: .stockeservercontent-type: te_t/_ml; charset=“utf-8”content-
25、length: nnnnsoapaction: “some-uri”_mlns:soap-env=“soap/envelope/”56789101112131415soap-env:encodingstyle=“soap/encoding/”/;sunw;ja_r为了支持uddi在java平台上的功能,java apis for _ml registries (ja_r)允许开发者来访问注册中心。值得注意的是,ja_r并不是建立web服务必需的,你可以利用其他常用的_ml apis来直接集成这些协议。ja_r是一个方便的api,它提供了java api来发布,查找以及编辑那些注册信息。它的重点
26、在于基于_ml的b2b应用,复杂的地址本查找以及对_ml消息订阅的支持等web服务。它也可以用来访问其他类型的注册中心,象eb_ml注册中心。这些对web服务的注册信息进行的操作,可以使用当前的一些web服务工具来完成(例如第三方的soap和eb_ml消息工具)。另外,当ja_p提供了一致并具有针对性的api来完成这些操作,这将使开发变得更加容易。ja_/rpc为了使开发人员专注于建立象soap那样的基于_ml的请求,jcp正在开发基于rpc (ja_/rpc) 的java api。ja_/rpc是用来发送和接收方法调用请求的,它基于_ml协议,象soap,或者其他的象_mlp (_ml pr
27、otocol,要了解更多可以参考_/_p/)。ja_/rpc使你不用再关注这些协议的规范,使应用的开发更快速。不久,开发人员就不用直接以_ml表示方法调用了。目前有很多第三方实现了soap,开发人员可以在不同的层次上调用soap,并选择使用哪一种。将来,ja_/rpc会取代这些apis并提供一个统一的接口来构造以及处理soap rpc请求。在接收一个从商业伙伴那里过来的soap请求的时候,一个java servlet用ja_/rpc来接收这个基于_ml的请求。一旦接收到请求后,servlet会调用商务方法,并且把结果回复给商业伙伴。ja_m当从商业合作伙伴那里接收一个web服务的请求时,我们需
28、要java api实现一个servlet来处理eb_ml消息,就象我们用ja_/rpc来处理soap请求一样。java api for _ml messaging (ja_m) 是集成_ml消息标准(象eb_ml消息或者soap消息)的规范。这个api是用来推动_ml消息处理的,它检测那些预定单的消息格式以及约束。它控制了所有的消息封装机制,用一种直观的方式分割了消息中的信息,象路由信息,发货单。这样,开发人员只要关注消息的有效负载,而不用去担心那些消息的重复处理。目前的开发人员用ja_p来实现ja_m将要提供的功能,ja_m将会提供一套非常具有针对性的api来处理基于_ml的消息传送。这将大
29、大简化开发人员的代码,并使它们具有统一的接口。ja_m和ja_/rpc的差别在于处理消息导向的中间件以及远程过程调用的不同。ja_m注重于消息导向,而ja_/rpc是用来完成远程过程调用的。以下是图解。请注意,在ja_m 和 ja_/rpc技术成熟之前,开发人员还是依赖于第三方的soap apis,象apache soap, idoo_oap, 以及 glue。当ja_m 和 ja_/rpc正式发布后,它将为当前不同的soap和eb_ml消息提供统一的接口。就象jdbc位多种不同的数据库提供统一的接口。ja_b_ml绑定技术可以把_ml文档和java对象进行自由转换。用ja_b,你可以在后台的
30、ejb层,把_ml文档转换成java对象。同样你也可以把从ejb中取出的java对象转换成_ml文档返回给用户。ja_b接口提供了比sa_和dom更高级的方法来处理_ml文档。它提供的特性可以在_ml数据和java类之间互相映射,提供了一个简单的方法来转换_ml数据。它比逐个解析标记更简单。2.2 建立weservice的步骤在建立weservice的时候,有三个主要步骤:1.建立客户端联接为了允许applets,applications,商业合作伙伴,浏览器和pdas 使用web服务。2.实现web服务包括工作流,数据传送,商业逻辑以及数据访问。这些功能是隐藏在web服务后,并且为客户端工作
31、的。3.联接后台系统这个系统可能包括一个或多个数据库,现存的企业信息系统,商业合作伙伴自己的系统或者web服务,以及在多个系统中共享的数据。基于j2ee的web服务的核心构架:rmi1.rmi-iiop2.rmi 是在java中使用remote method invocation的最初的方法,rmi使用java.rmi包rmi-iiop 是rmi的一个特殊版本,rmi-iiop可以和corba兼容,rmi-iiop使用java.rmi包和java_.rmijaf(java活动构架)开发者可以使用jaf来决定任意一块数据的类型、封装对数据的访问、寻找合适的操作、实例化相关的bean来执行这些操作
32、等。例如,javamail就是使用jaf根据mime类型来决定实例化那一个对象。ejb1.ejb组件实现代码的限制ejb组件的约束ejb的开发者并不需要在ejb的组件实现代码中编写系统级的服务,ejb提供商/开发者需知道并且严格地遵守一些限制,这些限制与开发稳定的和可移植的ejb组件的利益有 关。以下是你应该回避使用的一些java特色,并且在你的ejb组件的实现代码中要严格限制它们的使用:1.使用static,非final 字段。建议你在ejb组件中把所有的static字段都声明为final型的。这样可以保证前后一致的运行期语义,使得ejb容器有可以在多个java虚拟机之间分发组件实例的灵活性
33、。2.使用线程同步原语来同步多个组件实例的运行。避免这个问题,你就可以使ejb容器灵活的在多个java虚拟机之间分发组件实例。3.使用awt函数完成键盘的输入和显示输出。约束它的原因是服务器方的商业组件意味着提供商业功能而不包括用户界面和键盘的i/o功能。4.使用文件访问/java.io 操作。ejb商业组件意味着使用资管理器如jdbc来存储和检索数据而不是使用文件系统api。同时,部署工具提供了在部署描述器(descriptor)中存储环境实体,以至于ejb组件可以通过环境命名上下文用一种标准的方法进行环境实体查询。所以,使用文件系统的需求基本上是被排除了。5.监听和接收socket连接,或
34、者用socket进行多路发送。ejb组件并不意味着提供网络socket服务器功能,但是,这个体系结构使得ejb组件可以作为socket客户或是rmi客户并且可以和容器所管理的环境外面的代码进行通讯。6.使用映象api查询ejb组件由于安全规则所不能访问的类。这个约束加强了java平台的安全性。7.欲创建或获得一个类的加载器,设置或创建一个新的安全管理器,停止java虚拟机,改变输入、输出和出错流。这个约束加强了安全性同时保留了ejb容器管理运行环境的能力。8.设置socket工厂被url's serversocket,socket和stream handler使用。避免这个特点,可以加
35、强安全性同时保留了ejb容器管理运行环境的能力。9.使用任何方法启动、停止和管理线程。这个约束消除了与ejb容器管理死锁、线程和并发问题的责任相冲突的可能性。通过限制使用10-16几个特点,你的目标是堵上一个潜在的安全漏洞:10.直接读写文件描述符。11.为一段特定的代码获得安全策略信息。12.加载原始的类库。13.访问java一般角色所不能访问的包和类。14.在包中定义一个类。15.访问或修改安全配置对象(策略、安全、提供者、签名_者和实体)。16.使用java序列化特点中的细分类和对象替代。17.传递this引用指针作为一个参数或者作为返回值返回this引用指针。你必须使用sessionc
36、onte_t或entityconte_t中的getejbobject的结果。java2平台的安全策略以上所列的特点事实上正是java编程语言和java2标准版中的标准的、强有力的特色。ejb容器允许从j2se中使用一些或全部的受限制的特色,尽管对于ejb组件是不可用的,但需通过j2se的安全机制来使用而不是通过直接使用j2se的api。java2平台为ejb1.1规范中的ejb容器所制定的安全策略定义了安全许可集,这些许可在ejb组件的编程限制中出现。通过这个策略,定义了一些许可诸如:java.io.filepermission,java.permission,java.io.reflect.
37、reflectpermission,java.lang.security.securitypermission,以便加强先前所列出的编程限制。许多ejb容器没有加强这些限制,他们希望ejb组件开发者能遵守这些编程限制或者是带有冒险想法违背了这些限制。违背这些限制的ejb组件,比标准方法依赖过多或过少的安全许可,都将很少能在多个ejb容器间移植。另外,代码中都将隐藏着一些不确定的、难以预测的问题。所有这些都足以使ejb组件开发者应该知道这些编程限制,同时也应该认真地遵守它们。任何违背了这些编程限制的ejb组件的实现代码在编译时都不能检查出来,因为这些特点都是java语言和j2se中不可缺少的部分
38、。对于ejb组件的这些限制同样适用于ejb组件所使用的帮助/访问(helper/access)类,j2ee应用程序使用java文档(jar)文件格式打包到一个带.ear(代表enterprise archive)扩展名的文件中,这个ear文件对于发送给文件部署器来说是标准的格式。ear文件中包括在一个或多个ejb-jar文件中的ejb组件,还可能有ejb-jar所依赖的库文件。所有ear文件中的代码都是经过深思熟虑开发的应用程序并且都遵守编程限制和访问许可集。未来版本的规范可能会指定通过部署工具来定制安全许可的能力,通过这种方法指定了一个合法的组件应授予的许可权限,也指定了一个标准方法的需求:
39、如从文件系统中读文件应有哪些要求。一些ejb容器/服务器目前在它们的部署工具中都提供了比标准权限或多或少的许可权限,这些并不是ejb1.1规范中所需要的。理解这些约束ejb容器是ejb组件生存和执行的运行期环境,ejb容器为ejb组件实例提供了一些服务如:事务管理、安全持久化、资访问、客户端连接。ejb容器也负责ejb组件实例整个生命期的管理、扩展问题以及并发处理。所以,ejb组件就这样寄居在一个被管理的执行环境中-即ejb容器。因为ejb容器完全负责ejb组件的生命期、并发处理、资访问、安全等等,所以与容器本身的锁定和并发管理相冲突的可能性就需要消除,许多限制都需要使用来填上潜在的安全漏洞。
40、除了与ejb容器责任与安全冲突的问题,ejb组件还意味着仅仅聚焦于商务逻辑,它依赖于ejb容器所提供的服务而不是自己来直接解决底层的系统层的问题。 3 4 5 6 7 8 9 10 11 12 13 14 15可能的问题通常,ejb组件在容器之间的移植不可避免地与如下问题相关:1.它需要依靠的受限制的特点在特定ejb容器中没有得到加强。2.它需要依靠的非标准的服务从容器中可获得。为了保证ejb组件的可移植性和一致的行为,你应该使用一个具有与java2平台安全策略集相一致的策略集的容器来测试ejb组件,并且其加强了前述的编程限制。总结ejb组件开发者应该知道这些推荐的关于ejb组件的编程限制,明
41、白它们的重要性,并且从组件的稳定性和可移植性利益方面考虑来遵循它们。因为这些编程限制能阻止你使用标准的java语言的特点,违背了这些编程限制在编译时不会知道,并且加强这些限制也不是ejb容器的责任。所有这些原因都使你应很小心地遵守这些编程限制,这些限制在组件的合同中已经成为了一个条款,并且它们对于建造可靠的、可移植的组件是非常重要的。2.优化ejbentity bean为在应用程序和设计中描述持久化商业对象(persistent business objec ts)提供了一个清晰的模型。在java对象模型中,简单对象通常都是以一种简单的方式进行处理但是,很多商业对象所需要的事务化的持久性管理没
42、有得到实现。entity bean将持久化机制封装在容器提供的服务里,并且隐藏了所有的复杂性。entity bean允许应用程序操纵他们就像处理一个一般的java对象应用。除了从调用代码中隐藏持久化的形式和机制外,entity bean还允许ejb容器对对象的持久化进行优化,保证数据存储具有开放性,灵活性,以及可部署性。在一些基于ejb技术的项目中,广泛的使用oo技术导致了对entity bean的大量使用,sun的工程师们已经积累了很多使用entity bean的经验,这篇文章就详细阐述的这些卡发经验:_探索各种优化方法_提供性能优化和提高适用性的法则和建议_讨论如何避免一些教训。法则1:只
43、要可以,尽量使用cmpcmp方式不仅减少了编码的工作量,而且在container中以及container产生的数据库访问代码中包括了许多优化的可能。container可以访问内存缓冲中的bean,这就允许它可以监视缓冲中的任何变化。这样的话就在事物没有提交之前,如果缓存的数据没有变化就不用写到数据库中。就可以避免许多不必要的数据库写操作。另外一个优化是在调用find方法的时候。通常情况下find方法需要进行以下数据库操作:查找数据库中的纪录并且获得主键将纪录数据装入缓存cmp允许将这两步操作优化为一步就可以搞定。具体怎么做我也没弄明白,原文没有具体阐述法则2:写代码时尽量保证对bmp和cmp都
44、支持许多情况下,ejb的开发者可能无法控制他们写的bean怎么样被部署,以及使用的container是不是支持cmp.一个有效的解决方案是,将商业逻辑的编码完全和持久化机制分离。再cmp类中实现商业逻辑,然后再编写一个bmp类,用该类继承cmp类。这样的话,所有的商业逻辑都在cmp类中,而持久化机制在bmp中实现。我觉得这种情况在实际工作中很少遇到,但是作者解决问题的思路值得学习法则3:把ejbstore中的数据库访问减小到最少。如果使用bmp,设置一个缓存数据改变标志dirty非常有用。所有改变数据库中底层数据的操作,都要设置dirty,而在ejbstore中,首先检测dirty的值,如果d
45、irty的值没有改变,表明目前数据库中的数据与缓存的一致,就不必进行数据库操作了,反之,就要把缓存数据写入数据库。法则4:总是将从lookup和find中获得的引用进行缓存。(cache)引用缓存对session bean和entity bean 都是适用的。通过jndi lookup获得ejb资。比如datasource,bean的引用等等都要付出相当大的代价。因此应该避免多余的lookup.可以这样做:将这些引用定义为实例变量。从setentityconte_t(session bean使用setsessionconte_t)方法查找他们。setentityconte_t方法对于一个bean实例只执行一次,所有的相关引用都在这一次中进行查找,这样查找的代价就不是那么昂贵了。应该避免在其他方法中查找引用。尤其是访问数据库的方法:ejbload和ejbstore,如果在这些频繁调用的方法中进行datasource的查找,势必造成时间的浪费。调用其他entity bean的finder方法也是一种重量级的调用。多次调用finder方法的代价非常高。如果这种引用不适合放在setentityconte_t这样的初始化时执行的方法中执行,就应该在适当的时候缓存finder的执行结果。只是要注意的是,如果这个引用只对当前的entity有效,你就需要在bean从缓冲池中