﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-Jeff's Java Home</title><link>http://www.blogjava.net/liucunjie/</link><description>Jeff's Java Home</description><language>zh-cn</language><lastBuildDate>Mon, 13 Apr 2026 14:22:56 GMT</lastBuildDate><pubDate>Mon, 13 Apr 2026 14:22:56 GMT</pubDate><ttl>60</ttl><item><title>诚聘java开发工程师 （南京）</title><link>http://www.blogjava.net/liucunjie/archive/2010/03/03/314381.html</link><dc:creator>Jeff's Java Home</dc:creator><author>Jeff's Java Home</author><pubDate>Wed, 03 Mar 2010 02:27:00 GMT</pubDate><guid>http://www.blogjava.net/liucunjie/archive/2010/03/03/314381.html</guid><wfw:comment>http://www.blogjava.net/liucunjie/comments/314381.html</wfw:comment><comments>http://www.blogjava.net/liucunjie/archive/2010/03/03/314381.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/liucunjie/comments/commentRss/314381.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liucunjie/services/trackbacks/314381.html</trackback:ping><description><![CDATA[<span style="font-family: 宋体; color: rgb(51,51,51)"><br />
基本要求：</span><span style="font-family: &#8217;Times New Roman&#8217;; color: rgb(51,51,51)"> <br />
<br />
1</span><span style="font-family: 宋体; color: rgb(51,51,51)">，计算机相关专业专科学历或以上，从事软件项目实施和开发一年以上；</span><span style="font-family: &#8217;Times New Roman&#8217;; color: rgb(51,51,51)"> <br />
2</span><span style="font-family: 宋体; color: rgb(51,51,51)">，一年以上开发经验，熟悉</span><span style="font-family: &#8217;Times New Roman&#8217;; color: rgb(51,51,51)">Java</span><span style="font-family: 宋体; color: rgb(51,51,51)">、</span><span style="font-family: &#8217;Times New Roman&#8217;; color: rgb(51,51,51)">J2EE</span><span style="font-family: 宋体; color: rgb(51,51,51)">等，熟练使用基于</span><span style="font-family: &#8217;Times New Roman&#8217;; color: rgb(51,51,51)">Hibernate</span><span style="font-family: 宋体; color: rgb(51,51,51)">和</span><span style="font-family: &#8217;Times New Roman&#8217;; color: rgb(51,51,51)">Struts </span><span style="font-family: 宋体; color: rgb(51,51,51)">的</span><span style="font-family: &#8217;Times New Roman&#8217;; color: rgb(51,51,51)">MVC</span><span style="font-family: 宋体; color: rgb(51,51,51)">三层架构进行</span><span style="font-family: &#8217;Times New Roman&#8217;; color: rgb(51,51,51)">Web</span><span style="font-family: 宋体; color: rgb(51,51,51)">快速开发；</span><span style="font-family: &#8217;Times New Roman&#8217;; color: rgb(51,51,51)"><br />
3</span><span style="font-family: 宋体; color: rgb(51,51,51)">，熟悉关系型数据库技术，如</span><span style="font-family: &#8217;Times New Roman&#8217;; color: rgb(51,51,51)">SQL Server</span><span style="font-family: 宋体; color: rgb(51,51,51)">；</span><span style="font-family: &#8217;Times New Roman&#8217;; color: rgb(51,51,51)"><br />
4</span><span style="font-family: 宋体; color: rgb(51,51,51)">，熟悉应用服务器，如</span><span style="font-family: &#8217;Times New Roman&#8217;; color: rgb(51,51,51)">Jboss</span><span style="font-family: 宋体; color: rgb(51,51,51)">、</span><span style="font-family: &#8217;Times New Roman&#8217;; color: rgb(51,51,51)">Tomcat<br />
5</span><span style="font-family: 宋体; color: rgb(51,51,51)">，逻辑思路清晰，工作认真负责，良好的团队合作精神和客户沟通交流能力。<br />
</span><span style="font-family: &#8217;Times New Roman&#8217;; color: rgb(51,51,51)"><br />
</span><span style="font-family: 宋体; color: rgb(51,51,51)">符合以下条件之一优先：</span><span style="font-family: &#8217;Times New Roman&#8217;; color: rgb(51,51,51)"><br />
1</span><span style="font-family: 宋体; color: rgb(51,51,51)">，熟悉报表系统管理系统，熟悉</span><span style="font-family: &#8217;Times New Roman&#8217;; color: rgb(51,51,51)">jasperreport </span><span style="font-family: 宋体; color: rgb(51,51,51)">、</span><span style="font-family: &#8217;Times New Roman&#8217;; color: rgb(51,51,51)">jfreechart</span><span style="font-family: 宋体; color: rgb(51,51,51)">等；</span><span style="font-family: &#8217;Times New Roman&#8217;; color: rgb(51,51,51)"><br />
2</span><span style="font-family: 宋体; color: rgb(51,51,51)">，熟悉交通运输行业等；<br />
<br />
公司网址：<a href="http://www.tol.org.cn/rtcom/MainPage.jsp"><u><font color="#800080" face="宋体">http://www.tol.org.cn/rtcom/MainPage.jsp</font></u></a><br />
电子邮箱：&nbsp;jeff_liu@nuaa.edu.cn </span><!---doc_text--->
 <img src ="http://www.blogjava.net/liucunjie/aggbug/314381.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liucunjie/" target="_blank">Jeff's Java Home</a> 2010-03-03 10:27 <a href="http://www.blogjava.net/liucunjie/archive/2010/03/03/314381.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Dear List, Help...</title><link>http://www.blogjava.net/liucunjie/archive/2008/08/06/220463.html</link><dc:creator>Jeff's Java Home</dc:creator><author>Jeff's Java Home</author><pubDate>Wed, 06 Aug 2008 08:35:00 GMT</pubDate><guid>http://www.blogjava.net/liucunjie/archive/2008/08/06/220463.html</guid><wfw:comment>http://www.blogjava.net/liucunjie/comments/220463.html</wfw:comment><comments>http://www.blogjava.net/liucunjie/archive/2008/08/06/220463.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liucunjie/comments/commentRss/220463.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liucunjie/services/trackbacks/220463.html</trackback:ping><description><![CDATA[Dear List<br />
<br />
Is there any way to conversion from binary file to ascii/text file in java?<br />
is there any&nbsp;java module which works like this?<br />
<br />
Thanks &amp; Regards in Advance<br />
Jeff Liu
<img src ="http://www.blogjava.net/liucunjie/aggbug/220463.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liucunjie/" target="_blank">Jeff's Java Home</a> 2008-08-06 16:35 <a href="http://www.blogjava.net/liucunjie/archive/2008/08/06/220463.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JPA会是ORM的王道吗？（转）</title><link>http://www.blogjava.net/liucunjie/archive/2007/11/30/164176.html</link><dc:creator>Jeff's Java Home</dc:creator><author>Jeff's Java Home</author><pubDate>Fri, 30 Nov 2007 01:47:00 GMT</pubDate><guid>http://www.blogjava.net/liucunjie/archive/2007/11/30/164176.html</guid><wfw:comment>http://www.blogjava.net/liucunjie/comments/164176.html</wfw:comment><comments>http://www.blogjava.net/liucunjie/archive/2007/11/30/164176.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/liucunjie/comments/commentRss/164176.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liucunjie/services/trackbacks/164176.html</trackback:ping><description><![CDATA[<div class="postcontent">
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><span style="font-family: 宋体">近几年持久化技术领域异常喧嚣，各种框架雨后春笋般地冒出。例如</span>Spring<span style="font-family: 宋体">对多个持久化技术提供了集成的支持，还通过</span>Spring JDBC<span style="font-family: 宋体">框架对</span>JDBC API<span style="font-family: 宋体">进行简化。</span>Sun<span style="font-family: 宋体">也连接不断地颁布几个持久化规范，如</span>JPA(Java Persistence API)<span style="font-family: 宋体">。</span>JPA<span style="font-family: 宋体">作为</span>Java EE 5.0<span style="font-family: 宋体">平台标准的</span>ORM<span style="font-family: 宋体">规范，将得到所有</span>Java EE<span style="font-family: 宋体">服务器的支持。</span>Sun<span style="font-family: 宋体">这次吸取了之前</span>EJB<span style="font-family: 宋体">规范惨痛失败的经历，在充分吸收现有</span>ORM<span style="font-family: 宋体">框架的基础上，得到了一个易于使用、伸缩性强的</span>ORM<span style="font-family: 宋体">规范。从目前的开发社区的反应上看，</span>JPA<span style="font-family: 宋体">受到了极大的支持和赞扬，</span>JPA<span style="font-family: 宋体">作为</span>ORM<span style="font-family: 宋体">领域标准化整合者的目标应该不难实现。</span></span></span></p>
<p style="margin-left: 42pt; text-indent: -21pt; tab-stops: list 42.0pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><strong><span style="font-size: 14pt">一、<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><strong><span style="font-size: 14pt; font-family: 宋体">引子</span></strong></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><span style="font-family: 宋体">荀子在《荀子</span>&#183;<span style="font-family: 宋体">王制》中有云：王夺之人，霸夺之与，强夺之地。什么叫王道？就是仁义，以德待人，把人感动得甘心情愿认你当老大。什么叫霸道？就是你有实力，以力服人，谁不服就把他打服为止。从哲学上说，王道是正道，当然正道须以实力为基础。王道中也包含霸道，但王道顺势而行。</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><span style="font-family: 宋体">最近，笔者查看了</span>JPA<span style="font-family: 宋体">（</span>java <span style="font-family: 宋体">持久性</span>API)<span style="font-family: 宋体">的相关规范，作为</span>EJB3.0<span style="font-family: 宋体">的重要组成部分，</span>JPA<span style="font-family: 宋体">还是很值得关注的。看完规范，感觉</span>JPA<span style="font-family: 宋体">还是比较的单一，其目标就是实现</span>Java <span style="font-family: 宋体">持久性的通用。</span>JPA<span style="font-family: 宋体">采用纯</span>POJO<span style="font-family: 宋体">的方式实现，更多的是采用</span>Java 5<span style="font-family: 宋体">注释（</span>Annotation<span style="font-family: 宋体">），它利用</span> Java 5 <span style="font-family: 宋体">中的注释和对象</span>/<span style="font-family: 宋体">关系映射，为数据持久化提供了更简单、易用的编程方式。</span>JPA<span style="font-family: 宋体">的优势是多供应商的支持，可以运行在容器之中，也可以运行于容器之外，这就是其显著的优点。</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">Java&#8482; Platform<span style="font-family: 宋体">，</span> Enterprise Edition (Java EE 5)<span style="font-family: 宋体">的设计方法，充分利用了</span> Enterprise JavaBeans&#8482; (EJB) 3.0 <span style="font-family: 宋体">新的</span> Java Persistence API (JPA)<span style="font-family: 宋体">特性。</span>JPA <span style="font-family: 宋体">提供了一种标准的对象关系映射解决方案，该解决方案避免了依赖第三方框架（如</span> Hibernate<span style="font-family: 宋体">）。</span>Java EE 5 <span style="font-family: 宋体">许多新功能都包含在经过修补的</span> EJB <span style="font-family: 宋体">架构中，其突出特性之一是</span> JPA<span style="font-family: 宋体">。由于具有容器内和容器外持久性选项，</span>JPA <span style="font-family: 宋体">为</span> J2EE <span style="font-family: 宋体">软件架构师带来一系列全新设计选择。</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">JPA<span style="font-family: 宋体">受到了极大的支持和赞扬，那到</span>JPA<span style="font-family: 宋体">作为</span>ORM<span style="font-family: 宋体">领域标准化整合者的目标应该能实现吗？能成来</span>ORM<span style="font-family: 宋体">的王道吗？</span></span></span></p>
<p style="margin-left: 42pt; text-indent: -21pt; tab-stops: list 42.0pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><strong><span style="font-size: 14pt">二、<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><strong><span style="font-size: 14pt">JPA</span></strong><strong><span style="font-size: 14pt; font-family: 宋体">来了</span></strong></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">JPA<span style="font-family: 宋体">通过</span>JDK 5.0<span style="font-family: 宋体">注解或</span>XML<span style="font-family: 宋体">描述对象－关系表的映射关系，并将运行期的实体对象持久化到数据库中，图</span> 1<span style="font-family: 宋体">很好地描述了</span>JPA</span></span><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">的结构：<br />
</span></span></span></p>
<p style="text-indent: 21pt; text-align: center" align="center"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><span style="font-family: 宋体"><img height="383" alt="" src="http://www.blogjava.net/images/blogjava_net/sterning/JPA-P1.jpg" width="566" border="0" /><br />
图</span>1.JPA<span style="font-family: 宋体">的结构图</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">Sun<span style="font-family: 宋体">引入新的</span>JPA ORM<span style="font-family: 宋体">规范出于两个原因：其一，简化现有</span>Java EE<span style="font-family: 宋体">和</span>Java SE<span style="font-family: 宋体">应用的对象持久化的开发工作；其二，</span>Sun<span style="font-family: 宋体">希望整合对</span>ORM<span style="font-family: 宋体">技术，实现天下归一。</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">JPA<span style="font-family: 宋体">由</span>EJB 3.0<span style="font-family: 宋体">软件专家组开发，作为</span>JSR-220<span style="font-family: 宋体">实现的一部分。但它不囿于</span>EJB 3.0<span style="font-family: 宋体">，你可以在</span>Web<span style="font-family: 宋体">应用、甚至桌面应用中使用。</span>JPA<span style="font-family: 宋体">的宗旨是为</span>POJO<span style="font-family: 宋体">提供持久化标准规范，由此可见，经过这几年的实践探索，能够脱离容器独立运行，方便开发和测试的理念已经深入人心了。目前</span>Hibernate 3.2<span style="font-family: 宋体">、</span>TopLink 10.1.3<span style="font-family: 宋体">以及</span>OpenJPA<span style="font-family: 宋体">都提供了</span>JPA<span style="font-family: 宋体">的实现。</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">JPA<span style="font-family: 宋体">的总体思想和现有</span>Hibernate<span style="font-family: 宋体">、</span>TopLink<span style="font-family: 宋体">，</span>JDO<span style="font-family: 宋体">等</span>ORM<span style="font-family: 宋体">框架大体一致。总的来说，</span>JPA<span style="font-family: 宋体">包括以下</span>3<span style="font-family: 宋体">方面的技术：</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">ORM<span style="font-family: 宋体">映射元数据，</span>JPA<span style="font-family: 宋体">支持</span>XML<span style="font-family: 宋体">和</span>JDK 5.0<span style="font-family: 宋体">注解两种元数据的形式，元数据描述对象和表之间的映射关系，框架据此将实体对象持久化到数据库表中；</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">JPA <span style="font-family: 宋体">的</span>API<span style="font-family: 宋体">，用来操作实体对象，执行</span>CRUD<span style="font-family: 宋体">操作，框架在后台替我们完成所有的事情，开发者从繁琐的</span>JDBC<span style="font-family: 宋体">和</span>SQL<span style="font-family: 宋体">代码中解脱出来。</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><span style="font-family: 宋体">查询语言，这是持久化操作中很重要的一个方面，通过面向对象而非面向数据库的查询语言查询数据，避免程序的</span>SQL<span style="font-family: 宋体">语句紧密耦合。</span></span></span></p>
<p style="margin-left: 42pt; text-indent: -21pt; tab-stops: list 42.0pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><strong><span style="font-size: 14pt">三、<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><strong><span style="font-size: 14pt">JPA</span></strong><strong><span style="font-size: 14pt; font-family: 宋体">的优势</span></strong></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">1 <span style="font-family: 宋体">标准化</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">JPA <span style="font-family: 宋体">是</span> JCP <span style="font-family: 宋体">组织发布的</span> Java EE <span style="font-family: 宋体">标准之一，因此任何声称符合</span> JPA <span style="font-family: 宋体">标准的框架都遵循同样的架构，提供相同的访问</span> API<span style="font-family: 宋体">，这保证了基于</span>JPA<span style="font-family: 宋体">开发的企业应用能够经过少量的修改就能够在不同的</span>JPA<span style="font-family: 宋体">框架下运行。</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">2 <span style="font-family: 宋体">对容器级特性的支持</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">JPA <span style="font-family: 宋体">框架中支持大数据集、事务、并发等容器级事务，这使得</span> JPA <span style="font-family: 宋体">超越了简单持久化框架的局限，在企业应用发挥更大的作用。</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">3 <span style="font-family: 宋体">简单易用，集成方便</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">JPA<span style="font-family: 宋体">的主要目标之一就是提供更加简单的编程模型：在</span>JPA<span style="font-family: 宋体">框架下创建实体和创建</span>Java <span style="font-family: 宋体">类一样简单，没有任何的约束和限制，只需要使用</span> javax.persistence.Entity<span style="font-family: 宋体">进行注释；</span>JPA<span style="font-family: 宋体">的框架和接口也都非常简单，没有太多特别的规则和设计模式的要求，开发者可以很容易的掌握。</span>JPA<span style="font-family: 宋体">基于非侵入式原则设计，因此可以很容易的和其它框架或者容器集成。</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">4 <span style="font-family: 宋体">可媲美</span>JDBC<span style="font-family: 宋体">的查询能力</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><span style="color: black; font-family: ˎ̥">JPA</span><span style="color: black; font-family: 宋体">的查询语言是</span><span style="font-family: 宋体">面向对象而非面向数据库的，它以面向对象的自然语法构造查询语句，可以看成是</span></span></span><a href="http://www.qqread.com/z/hibernate/index.html" target="_blank"><span style="color: windowtext; text-decoration: none; text-underline: none"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">Hibernate</span></span></a><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"> HQL</span></span></span><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><span style="font-family: 宋体">的等价物。</span>JPA<span style="font-family: 宋体">定义了独特的</span>JPQL<span style="font-family: 宋体">（</span>Java Persistence Query Language<span style="font-family: 宋体">），</span>JPQL<span style="font-family: 宋体">是</span>EJB QL<span style="font-family: 宋体">的一种扩展，它是针对实体的一种查询语言，操作对象是实体，而不是关系数据库的表，而且能够支持批量更新和修改、</span>JOIN<span style="font-family: 宋体">、</span>GROUP BY<span style="font-family: 宋体">、</span>HAVING <span style="font-family: 宋体">等通常只有</span> SQL <span style="font-family: 宋体">才能够提供的高级查询特性，甚至还能够支持子查询。</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">5 <span style="font-family: 宋体">支持面向对象的高级特性</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">JPA <span style="font-family: 宋体">中能够支持面向对象的高级特性，如类之间的继承、多态和类之间的复杂关系，这样的支持能够让开发者最大限度的使用面向对象的模型设计企业应用，而不需要自行处理这些特性在关系数据库的持久化。</span></span></span></p>
<p style="margin-left: 42pt; text-indent: -21pt; tab-stops: list 42.0pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><strong><span style="font-size: 14pt">四、<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><strong><span style="font-size: 14pt">JPA</span></strong><strong><span style="font-size: 14pt; font-family: 宋体">的供应商</span></strong></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">JPA <span style="font-family: 宋体">的目标之一是制定一个可以由很多供应商实现的</span>API<span style="font-family: 宋体">，并且开发人员可以编码来实现该</span>API<span style="font-family: 宋体">，而不是使用私有供应商特有的</span>API<span style="font-family: 宋体">。因此开发人员只需使用供应商特有的</span>API<span style="font-family: 宋体">来获得</span>JPA<span style="font-family: 宋体">规范没有解决但应用程序中需要的功能。尽可能地使用</span>JPA API<span style="font-family: 宋体">，但是当需要供应商公开但是规范中没有提供的功能时，则使用供应商特有的</span>API<span style="font-family: 宋体">。</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">1 Hibernate</span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">JPA<span style="font-family: 宋体">是需要</span>Provider<span style="font-family: 宋体">来实现其功能的，</span>Hibernate<span style="font-family: 宋体">就是</span>JPA Provider<span style="font-family: 宋体">中很强的一个，目前来说应该无人能出其右。从功能上来说，</span>JPA<span style="font-family: 宋体">现在就是</span>Hibernate<span style="font-family: 宋体">功能的一个子集。</span>Hibernate <span style="font-family: 宋体">从</span>3.2<span style="font-family: 宋体">开始，就开始兼容</span>JPA<span style="font-family: 宋体">。</span>Hibernate3.2<span style="font-family: 宋体">获得了</span>Sun TCK<span style="font-family: 宋体">的</span>JPA(Java Persistence API) <span style="font-family: 宋体">兼容认证。</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><span style="font-family: 宋体">只要熟悉</span>Hibernate<span style="font-family: 宋体">或者其他</span>ORM<span style="font-family: 宋体">框架，在使用</span>JPA<span style="font-family: 宋体">时会发现其实非常容易上手。例如实体对象的状态，在</span>Hibernate<span style="font-family: 宋体">有自由、持久、游离三种，</span>JPA<span style="font-family: 宋体">里有</span>new<span style="font-family: 宋体">，</span>managed<span style="font-family: 宋体">，</span>detached<span style="font-family: 宋体">，</span>removed<span style="font-family: 宋体">，明眼人一看就知道，这些状态都是一一对应的。再如</span>flush<span style="font-family: 宋体">方法，都是对应的，而其他的再如说</span>Query query = manager.createQuery(sql)<span style="font-family: 宋体">，它在</span>Hibernate<span style="font-family: 宋体">里写法上是</span>session<span style="font-family: 宋体">，而在</span>JPA<span style="font-family: 宋体">中变成了</span>manager<span style="font-family: 宋体">，所以从</span>Hibernate<span style="font-family: 宋体">到</span>JPA<span style="font-family: 宋体">的代价应该是非常小的</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><span style="font-family: 宋体">同样，</span>JDO<span style="font-family: 宋体">，也开始兼容</span>JPA<span style="font-family: 宋体">。在</span>ORM<span style="font-family: 宋体">的领域中，看来</span>JPA<span style="font-family: 宋体">已经是王道，规范就是规范。在各大厂商的支持下，</span>JPA<span style="font-family: 宋体">的使用开始变得广泛。</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">2 Spring</span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">Spring&nbsp;+&nbsp;Hibernate&nbsp;<span style="font-family: 宋体">常常被称为</span>&nbsp;Java&nbsp;Web&nbsp;<span style="font-family: 宋体">应用人气最旺的框架组合。而在</span>&nbsp;JCP&nbsp;<span style="font-family: 宋体">通过的</span>&nbsp;Web&nbsp;Beans&nbsp;JSR&nbsp;<span style="font-family: 宋体">，却欲将</span>JSF&nbsp;+&nbsp;EJB&nbsp;+&nbsp;JPA&nbsp;<span style="font-family: 宋体">、来自</span>&nbsp;JBoss&nbsp;Seam<span style="font-family: 宋体">（</span>Spring&nbsp;<span style="font-family: 宋体">除外）的一些组件和</span>EJB&nbsp;3<span style="font-family: 宋体">（目前能够提供有基本拦截和依赖注入功能的简化</span>&nbsp;Session&nbsp;Bean&nbsp;<span style="font-family: 宋体">框架）的一个</span>&nbsp;Web&nbsp;<span style="font-family: 宋体">组合进行标准化。如今的</span>&nbsp;Spring&nbsp;2.0&nbsp;<span style="font-family: 宋体">为</span>&nbsp;JPA&nbsp;<span style="font-family: 宋体">提供了完整的</span>&nbsp;EJB&nbsp;<span style="font-family: 宋体">容器契约，允许</span>&nbsp;JPA<span style="font-family: 宋体">在任何环境内可以在</span>&nbsp;Spring&nbsp;<span style="font-family: 宋体">管理的服务层使用（包括</span>&nbsp;Spring&nbsp;<span style="font-family: 宋体">的所有</span>&nbsp;AOP&nbsp;<span style="font-family: 宋体">和</span>&nbsp;DI&nbsp;<span style="font-family: 宋体">增强）。同时，关于下一个</span>Web<span style="font-family: 宋体">应用组合会是</span>&nbsp;EJB<span style="font-family: 宋体">、</span>Spring&nbsp;+&nbsp;Hibernate&nbsp;<span style="font-family: 宋体">还是</span>&nbsp;Spring&nbsp;+&nbsp;JPA&nbsp;<span style="font-family: 宋体">的论战，早已充斥于耳。</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><span style="font-family: 宋体">在</span>Spring 2.0.1<span style="font-family: 宋体">中，正式提供对</span>JPA<span style="font-family: 宋体">的支持，这也促成了</span>JPA<span style="font-family: 宋体">的发展，要知道</span>JPA<span style="font-family: 宋体">的好处在于可以分离于容器运行，变得更加的简洁。</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">3 OpenJPA</span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">OpenJPA <span style="font-family: 宋体">是</span> Apache <span style="font-family: 宋体">组织提供的开源项目，它实现了</span> EJB 3.0 <span style="font-family: 宋体">中的</span> JPA <span style="font-family: 宋体">标准，为开发者提供功能强大、使用简单的持久化数据管理框架。</span>OpenJPA <span style="font-family: 宋体">封装了和关系型数据库交互的操作，让开发者把注意力集中在编写业务逻辑上。</span>OpenJPA <span style="font-family: 宋体">可以作为独立的持久层框架发挥作用，也可以轻松的与其它</span> Java EE <span style="font-family: 宋体">应用框架或者符合</span> EJB 3.0 <span style="font-family: 宋体">标准的容器集成。</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">4 <span style="font-family: 宋体">其它</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><span style="font-family: 宋体">目前支持的实现包括</span>Toplink<span style="font-family: 宋体">、</span>Hibernate Entitymanager<span style="font-family: 宋体">等。</span>TopLink<span style="font-family: 宋体">以前需要收费，如今开源了。</span>OpenJPA<span style="font-family: 宋体">虽然免费，但功能、性能、普及性等方面更加需要加大力度。</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><span style="font-family: 宋体">对于</span>EJB<span style="font-family: 宋体">来说，实体</span>Bean<span style="font-family: 宋体">一直是被批评的对象，由于其太复杂和庞大。</span>JPA<span style="font-family: 宋体">的出现，很大程度的分离了复杂性。这让</span>EJB<span style="font-family: 宋体">的推广也变得容易。</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><span style="font-family: 宋体">总而言之，</span>JPA<span style="font-family: 宋体">规范主要关注的仅是</span>API<span style="font-family: 宋体">的行为方面，而由各种实现完成大多数性能有关的调优。尽管如此，所有可靠的实现都应该拥有某种数据缓存，以作为选择。但愿不久的将来，</span>JPA<span style="font-family: 宋体">能成为真正的标准。</span></span></span></p>
<p style="margin-left: 42pt; text-indent: -21pt; tab-stops: list 42.0pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><strong><span style="font-size: 14pt">五、<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><strong><span style="font-size: 14pt; font-family: 宋体">小结</span></strong></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">EJB 3.0<span style="font-family: 宋体">和</span>JPA <span style="font-family: 宋体">毫无疑问将是</span>Java EE 5<span style="font-family: 宋体">的主要卖点。在某些领域中，它们给</span>Java<span style="font-family: 宋体">社区带来了竞争优势，并使</span>Java <span style="font-family: 宋体">在其他领域与竞争对手不分伯仲（因为，不可否认，目前某些领域尚不存在基于标准的方法）。</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><span style="font-family: 宋体">过去数年来，</span>Spring Framework<span style="font-family: 宋体">一直是</span>EJB<span style="font-family: 宋体">在企业领域的主要竞争对手。</span>EJB3.0<span style="font-family: 宋体">规范解决了很多促进</span>Spring<span style="font-family: 宋体">兴起的问题。随着它的出现，</span>EJB3.0<span style="font-family: 宋体">毫无疑问比</span>Spring<span style="font-family: 宋体">提供了更好的开发体验——最引人注目的优势是它不需要配置文件。</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">JPA<span style="font-family: 宋体">提供一种标准的</span>OR<span style="font-family: 宋体">映射解决方案，该解决方案完全集成到</span>EJB3<span style="font-family: 宋体">。</span>0<span style="font-family: 宋体">兼容的容器中。</span>JPA<span style="font-family: 宋体">的前辈将会继续稳定发展，但是业务应用程序中的</span> raw <span style="font-family: 宋体">使用将可能会减少。实现</span> JPA <span style="font-family: 宋体">兼容的实体管理器似乎很可能是此类技术的发展方向。</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">Java EE<span style="font-family: 宋体">系列规范的较大问题与</span>JPA<span style="font-family: 宋体">没有任何关系。</span>Java EE <span style="font-family: 宋体">系列规范的问题涉及到</span> Web<span style="font-family: 宋体">和</span>EJB<span style="font-family: 宋体">容器之间的集成。</span>Spring<span style="font-family: 宋体">在此领域仍然具有主要竞争优势。</span>JBoss<span style="font-family: 宋体">的</span>Seam<span style="font-family: 宋体">项目尝试使用自定义的方法来解决这一问题。</span>Caucho Resin<span style="font-family: 宋体">应用服务器试图扩展容器边界并支持在</span>Web<span style="font-family: 宋体">容器中使用</span>@EJB<span style="font-family: 宋体">注释。我们希望</span>Java EE 5.1<span style="font-family: 宋体">将解决层集成的问题，为我们提供一个全面而标准的依赖性注入方法。</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><span style="font-family: 宋体">在不久的将来，</span>Sun<span style="font-family: 宋体">可能会将</span>JPA<span style="font-family: 宋体">作为一个单独的</span>JSR<span style="font-family: 宋体">对待，同时</span>JPA<span style="font-family: 宋体">还可能作为</span></span></span><a href="http://www.qqread.com/keys/java/index.html" target="_blank"><span style="color: windowtext; text-decoration: none; text-underline: none"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">Java</span></span></a><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"> SE</span></span></span><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><span style="font-family: 宋体">的一部分。不过这些都不太重要，重要的是，我们现在已经可以在脱离容器的情况下、在</span>Java SE<span style="font-family: 宋体">应用中使用</span>JPA<span style="font-family: 宋体">了。</span>&nbsp;</span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">JPA<span style="font-family: 宋体">已经作为一项对象持久化的标准，不但可以获得</span>Java EE<span style="font-family: 宋体">应用</span></span></span><a href="http://www.qqread.com/network/server/index.html" target="_blank"><span style="color: windowtext; font-family: 宋体; text-decoration: none; text-underline: none"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">服务器</span></span></a></span><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><span style="font-family: 宋体">的支持，还可以直接在</span>Java SE<span style="font-family: 宋体">中使用。开发者将无需在现有多种</span>ORM<span style="font-family: 宋体">框架中艰难地选择，按照</span>Sun<span style="font-family: 宋体">的预想，现有</span>ORM<span style="font-family: 宋体">框架头顶的光环将渐渐暗淡，不再具有以往的吸引力。</span></span></span></p>
</div>
<img src ="http://www.blogjava.net/liucunjie/aggbug/164176.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liucunjie/" target="_blank">Jeff's Java Home</a> 2007-11-30 09:47 <a href="http://www.blogjava.net/liucunjie/archive/2007/11/30/164176.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java 中的堆和栈（转）</title><link>http://www.blogjava.net/liucunjie/archive/2007/11/30/164165.html</link><dc:creator>Jeff's Java Home</dc:creator><author>Jeff's Java Home</author><pubDate>Fri, 30 Nov 2007 01:18:00 GMT</pubDate><guid>http://www.blogjava.net/liucunjie/archive/2007/11/30/164165.html</guid><wfw:comment>http://www.blogjava.net/liucunjie/comments/164165.html</wfw:comment><comments>http://www.blogjava.net/liucunjie/archive/2007/11/30/164165.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liucunjie/comments/commentRss/164165.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liucunjie/services/trackbacks/164165.html</trackback:ping><description><![CDATA[<strong><span style="font-size: 10pt"><strong>Java 中的堆和栈</strong><br />
<br />
简单的说：<br />
Java把内存划分成两种：一种是栈内存，一种是堆内存。&nbsp; &nbsp;<br />
&nbsp; &nbsp; <br />
&nbsp;&nbsp;在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。&nbsp; &nbsp;<br />
&nbsp; &nbsp; <br />
&nbsp;&nbsp;当在一段代码块定义一个变量时，Java就在栈中为这个变量分配内存空间，当超过变量的作用域后，Java会自动释放掉为该变量所分配的内存空间，该内存空间可以立即被另作他用。&nbsp; &nbsp;<br />
&nbsp; &nbsp; <br />
&nbsp;&nbsp;堆内存用来存放由new创建的对象和数组。&nbsp; &nbsp;<br />
&nbsp; &nbsp; <br />
&nbsp;&nbsp;在堆中分配的内存，由Java虚拟机的自动垃圾回收器来管理。&nbsp; &nbsp;<br />
&nbsp; &nbsp; <br />
&nbsp;&nbsp;在堆中产生了一个数组或对象后，还可以在栈中定义一个特殊的变量，让栈中这个变量的取值等于数组或对象在堆内存中的首地址，栈中的这个变量就成了数组或对象的引用变量。&nbsp; &nbsp;<br />
&nbsp; &nbsp; <br />
&nbsp;&nbsp;引用变量就相当于是为数组或对象起的一个名称，以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。&nbsp; &nbsp;<br />
&nbsp; &nbsp; <br />
<br />
<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<br />
<br />
具体的说：<br />
栈与堆都是Java用来在Ram中存放数据的地方。与C++不同，Java自动管理栈和堆，程序员不能直接地设置栈或堆。 <br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; Java的堆是一个运行时数据区,类的(对象从中分配空间。这些对象通过new、newarray、anewarray和multianewarray等指令建立，它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的，堆的优势是可以动态地分配内存大小，生存期也不必事先告诉编译器，因为它是在运行时动态分配内存的，Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是，由于要在运行时动态分配内存，存取速度较慢。 <br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;栈的优势是，存取速度比堆要快，仅次于寄存器，栈数据可以共享。但缺点是，存在栈中的数据大小与生存期必须是确定的，缺乏灵活性。栈中主要存放一些基本类型的变量（,int, short, long, byte, float, double, boolean, char）和对象句柄。 <br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;栈有一个很重要的特殊性，就是存在栈中的数据可以共享。假设我们同时定义： <br />
int a = 3; <br />
int b = 3； <br />
编译器先处理int a = 3；首先它会在栈中创建一个变量为a的引用，然后查找栈中是否有3这个值，如果没找到，就将3存放进来，然后将a指向3。接着处理int b = 3；在创建完b的引用变量后，因为在栈中已经有3这个值，便将b直接指向3。这样，就出现了a与b同时均指向3的情况。这时，如果再令a=4；那么编译器会重新搜索栈中是否有4值，如果没有，则将4存放进来，并令a指向4；如果已经有了，则直接将a指向这个地址。因此a值的改变不会影响到b的值。要注意这种数据的共享与两个对象的引用同时指向一个对象的这种共享是不同的，因为这种情况a的修改并不会影响到b, 它是由编译器完成的，它有利于节省空间。而一个对象引用变量修改了这个对象的内部状态，会影响到另一个对象引用变量。 <br />
<br />
String是一个特殊的包装类数据。可以用： <br />
String str = new String("abc"); <br />
String str = "abc"; <br />
两种的形式来创建，第一种是用new()来新建对象的，它会在存放于堆中。每调用一次就会创建一个新的对象。 <br />
而第二种是先在栈中创建一个对String类的对象引用变量str，然后查找栈中有没有存放"abc"，如果没有，则将"abc"存放进栈，并令str指向&#8221;abc&#8221;，如果已经有&#8221;abc&#8221; 则直接令str指向&#8220;abc&#8221;。 <br />
<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;比较类里面的数值是否相等时，用equals()方法；当测试两个包装类的引用是否指向同一个对象时，用==，下面用例子说明上面的理论。 <br />
String str1 = "abc"; <br />
String str2 = "abc"; <br />
System.out.println(str1==str2); //true <br />
可以看出str1和str2是指向同一个对象的。 <br />
<br />
String str1 =new String ("abc"); <br />
String str2 =new String ("abc"); <br />
System.out.println(str1==str2); // false <br />
用new的方式是生成不同的对象。每一次生成一个。 <br />
&nbsp; &nbsp;&nbsp; &nbsp; 因此用第一种方式创建多个&#8221;abc&#8221;字符串,在内存中其实只存在一个对象而已. 这种写法有利与节省内存空间. 同时它可以在一定程度上提高程序的运行速度，因为JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象。而对于String str = new String("abc")；的代码，则一概在堆中创建新对象，而不管其字符串值是否相等，是否有必要创建新对象，从而加重了程序的负担。 <br />
&nbsp; &nbsp;&nbsp; &nbsp; 另一方面, 要注意: 我们在使用诸如String str = "abc"；的格式定义类时，总是想当然地认为，创建了String类的对象str。担心陷阱！对象可能并没有被创建！而可能只是指向一个先前已经创建的对象。只有通过new()方法才能保证每次都创建一个新的对象。由于String类的immutable性质，当String变量需要经常变换其值时，应该考虑使用StringBuffer类，以提高程序效率。<br />
<br />
<br />
<br />
<br />
java中内存分配策略及堆和栈的比较 <br />
2.1 内存分配策略 <br />
按照编译原理的观点,程序运行时的内存分配有三种策略,分别是静态的,栈式的,和堆式的. <br />
静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编译时就可以给他们分配固定的内存空间.这种分配策略要求程序代码中不允许有可变数据结构(比如可变数组)的存在,也不允许有嵌套或者递归的结构出现,因为它们都会导致编译程序无法计算准确的存储空间需求. <br />
栈式存储分配也可称为动态存储分配,是由一个类似于堆栈的运行栈来实现的.和静态存储分配相反,在栈式存储方案中,程序对数据区的需求在编译时是完全未知的,只有到运行的时候才能够知道,但是规定在运行中进入一个程序模块时,必须知道该程序模块所需的数据区大小才能够为其分配内存.和我们在数据结构所熟知的栈一样,栈式存储分配按照先进后出的原则进行分配。 <br />
静态存储分配要求在编译时能知道所有变量的存储要求,栈式存储分配要求在过程的入口处必须知道所有的存储要求,而堆式存储分配则专门负责在编译时或运行时模块入口处都无法确定存储要求的数据结构的内存分配,比如可变长度串和对象实例.堆由大片的可利用块或空闲块组成,堆中的内存可以按照任意顺序分配和释放. <br />
<br />
2.2 堆和栈的比较 <br />
上面的定义从编译原理的教材中总结而来,除静态存储分配之外,都显得很呆板和难以理解,下面撇开静态存储分配,集中比较堆和栈: <br />
从堆和栈的功能和作用来通俗的比较,堆主要用来存放对象的，栈主要是用来执行程序的.而这种不同又主要是由于堆和栈的特点决定的: <br />
在编程中，例如C/C++中，所有的方法调用都是通过栈来进行的,所有的局部变量,形式参数都是从栈中分配内存空间的。实际上也不是什么分配,只是从栈顶向上用就行,就好像工厂中的传送带(conveyor belt)一样,Stack Pointer会自动指引你到放东西的位置,你所要做的只是把东西放下来就行.退出函数的时候，修改栈指针就可以把栈中的内容销毁.这样的模式速度最快, 当然要用来运行程序了.需要注意的是,在分配的时候,比如为一个即将要调用的程序模块分配数据区时,应事先知道这个数据区的大小,也就说是虽然分配是在程序运行时进行的,但是分配的大小多少是确定的,不变的,而这个"大小多少"是在编译时确定的,不是在运行时. <br />
堆是应用程序在运行的时候请求操作系统分配给自己内存，由于从操作系统管理的内存分配,所以在分配和销毁时都要占用时间，因此用堆的效率非常低.但是堆的优点在于,编译器不必知道要从堆里分配多少存储空间，也不必知道存储的数据要在堆里停留多长的时间,因此,用堆保存数据时会得到更大的灵活性。事实上,面向对象的多态性,堆内存分配是必不可少的,因为多态变量所需的存储空间只有在运行时创建了对象之后才能确定.在C++中，要求创建一个对象时，只需用 new命令编制相关的代码即可。执行这些代码时，会在堆里自动进行数据的保存.当然，为达到这种灵活性，必然会付出一定的代价:在堆里分配存储空间时会花掉更长的时间！这也正是导致我们刚才所说的效率低的原因,看来列宁同志说的好,人的优点往往也是人的缺点,人的缺点往往也是人的优点(晕~). <br />
<br />
<br />
2.3 JVM中的堆和栈 <br />
JVM是基于堆栈的虚拟机.JVM为每个新创建的线程都分配一个堆栈.也就是说,对于一个Java程序来说，它的运行就是通过对堆栈的操作来完成的。堆栈以帧为单位保存线程的状态。JVM对堆栈只进行两种操作:以帧为单位的压栈和出栈操作。 <br />
我们知道,某个线程正在执行的方法称为此线程的当前方法.我们可能不知道,当前方法使用的帧称为当前帧。当线程激活一个Java方法,JVM就会在线程的 Java堆栈里新压入一个帧。这个帧自然成为了当前帧.在此方法执行期间,这个帧将用来保存参数,局部变量,中间计算过程和其他数据.这个帧在这里和编译原理中的活动纪录的概念是差不多的. <br />
从Java的这种分配机制来看,堆栈又可以这样理解:堆栈(Stack)是操作系统在建立某个进程时或者线程(在支持多线程的操作系统中是线程)为这个线程建立的存储区域，该区域具有先进后出的特性。 <br />
每一个Java应用都唯一对应一个JVM实例，每一个实例唯一对应一个堆。应用程序在运行中所创建的所有类实例或数组都放在这个堆中,并由应用所有的线程共享.跟C/C++不同，Java中分配堆内存是自动初始化的。Java中所有对象的存储空间都是在堆中分配的，但是这个对象的引用却是在堆栈中分配,也就是说在建立一个对象时从两个地方都分配内存，在堆中分配的内存实际建立这个对象，而在堆栈中分配的内存只是一个指向这个堆对象的指针(引用)而已。 </span></strong>
<img src ="http://www.blogjava.net/liucunjie/aggbug/164165.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liucunjie/" target="_blank">Jeff's Java Home</a> 2007-11-30 09:18 <a href="http://www.blogjava.net/liucunjie/archive/2007/11/30/164165.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Export_Access_2_Oracle(把数据从Access 导入到Oracle里)</title><link>http://www.blogjava.net/liucunjie/archive/2006/03/04/33635.html</link><dc:creator>Jeff's Java Home</dc:creator><author>Jeff's Java Home</author><pubDate>Sat, 04 Mar 2006 14:17:00 GMT</pubDate><guid>http://www.blogjava.net/liucunjie/archive/2006/03/04/33635.html</guid><wfw:comment>http://www.blogjava.net/liucunjie/comments/33635.html</wfw:comment><comments>http://www.blogjava.net/liucunjie/archive/2006/03/04/33635.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liucunjie/comments/commentRss/33635.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liucunjie/services/trackbacks/33635.html</trackback:ping><description><![CDATA[<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 36pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt"><SPAN lang=EN-US>1)<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN lang=EN-US>Open Access to have all the tables ready.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN><B style="mso-bidi-font-weight: normal">Please note</B>:<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>the tables must be all upper case, like <B style="mso-bidi-font-weight: normal">CUST_PRM</B>, not like cust_prm.</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 36pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt"><SPAN lang=EN-US>2)<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN lang=EN-US>Select a table and right mouse click on it.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>Then a menu bar shows up.<SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>In the menu bar, select and click on the “<B style="mso-bidi-font-weight: normal">Export</B>” menu.</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt"><?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><v:line id=_x0000_s1026 style="Z-INDEX: 1; LEFT: 0px; POSITION: absolute; TEXT-ALIGN: left; flip: x" to="351pt,160.8pt" from="126pt,79.8pt"><v:stroke endarrow="block"></v:stroke></v:line><SPAN lang=EN-US><v:shapetype id=_x0000_t75 stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></v:path><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:lock aspectratio="t" v:ext="edit"></o:lock></v:shapetype></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt"><SPAN lang=EN-US>&nbsp;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 36pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt"><SPAN lang=EN-US>3)<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN lang=EN-US>In the popped up File Selection window, select the value “<B style="mso-bidi-font-weight: normal">ODBC Databases()</B>” in the “<B style="mso-bidi-font-weight: normal">Save As Type</B>” field.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;</SPAN>Please see picture below:</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt"><v:line id=_x0000_s1027 style="Z-INDEX: 2; LEFT: 0px; POSITION: absolute; TEXT-ALIGN: left; flip: x" to="486pt,261pt" from="225pt,243pt"><v:stroke endarrow="block"></v:stroke></v:line><SPAN lang=EN-US></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt"><SPAN lang=EN-US>&nbsp;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 36pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt"><SPAN lang=EN-US>4)<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN lang=EN-US>Then in the “Export” dialog, the table name defaults to the same table name in Access.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>Do not change it.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>You simply click on <B style="mso-bidi-font-weight: normal">OK</B> button.</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt"><SPAN lang=EN-US></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes"></SPAN></SPAN>&nbsp;</P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 36pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt"><SPAN lang=EN-US>5)<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN lang=EN-US>In the “Select Data Source” window, click on the “<B style="mso-bidi-font-weight: normal">Machine Data Source</B>” TAB.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>Then select your oracle database, such as “<B style="mso-bidi-font-weight: normal">prm</B>”.<SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>Then click on <B style="mso-bidi-font-weight: normal">OK</B> button.</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt"><v:oval id=_x0000_s1028 style="MARGIN-TOP: -9pt; Z-INDEX: 3; LEFT: 0px; MARGIN-LEFT: 1in; WIDTH: 153pt; POSITION: absolute; HEIGHT: 81pt; TEXT-ALIGN: left" filled="f"></v:oval><SPAN lang=EN-US></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt"><SPAN lang=EN-US>&nbsp;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 36pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt"><SPAN lang=EN-US>6)<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN lang=EN-US>Then in the “Oracle ODBC Driver Connect” window, type in the password and then click on <B style="mso-bidi-font-weight: normal">OK</B> button.</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt"><SPAN lang=EN-US></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt"><SPAN lang=EN-US>&nbsp;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt"><SPAN lang=EN-US>Wait until the data is replicated into Oracle.</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt"><SPAN lang=EN-US>&nbsp;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 36pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt"><SPAN lang=EN-US>7)<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN lang=EN-US>Open a DOS prompt, and type “<B style="mso-bidi-font-weight: normal">sqlplus u1/p1</B>”.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>Here, u1 and p1 are my username/password of my PRM database.<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>You should use your own database username and password.</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 36pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt"><SPAN lang=EN-US>8)<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN lang=EN-US>After login into sqlplus, type “<B style="mso-bidi-font-weight: normal">select * from TAB;</B>”, you will see your table created.</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 36pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt"><SPAN lang=EN-US>9)<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN lang=EN-US>In sqlplus, type command “desc <B style="mso-bidi-font-weight: normal">CUST_PRM;</B>”</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 36pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt"><SPAN lang=EN-US>10)<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp; </SPAN></SPAN><SPAN lang=EN-US>In sqlplus, type command “select * from <B style="mso-bidi-font-weight: normal">CUST_PRM;</B>”<BR><BR>注意在导入之前一定确保Oracle里没有相同的表<BR><BR>不好意思，图显示不出来，请下载Document吧</SPAN></P><img src ="http://www.blogjava.net/liucunjie/aggbug/33635.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liucunjie/" target="_blank">Jeff's Java Home</a> 2006-03-04 22:17 <a href="http://www.blogjava.net/liucunjie/archive/2006/03/04/33635.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>