container程序员打的是什么意思?
详细解释一下“netkinghancong”所说的“容器就是用来装东西的”:
比如说碗可以作为水的容器,油桶可以作为油的容器。同样,map 可以作为 class A 对象的容器。
为了方便,C++ 中 stl 自带一些容器,map、set、vector、list、queue 等是根据不同的数据结构来制定的容器。由于不能指定容器中结点的类型(如 class A),所以采用模板的形式实现的。
如果你没学过 typedef ,去看看,下面的话当作你了解 typedef ,可以当做 string 中的代码:
typedef size_t size_type;
模板中采用这种方式对一些类型进行再定义,目的是可以很方便地更改这些类型,或者在有必要的时候将该类型作为模板参数,是提高代码“可维护性”的表现。
C++ 中的模板:
为了让 C++ 具有“泛型编程”的能力而引进,主要为了编写“适合各种类型”的代码。如 vector 并不是一个 class (类型),vector、vector、vector 等才是(当然,三者并不是同一类型)。
认识模板,到应用模板,到编写模板,是一个较为长远的思维路程。这比从“面向过程”到“面向对象”绝对有过之而无不及。一般 C++ 面向对象有了很好的了解之后,可以开始对泛型编程的试探。而在此之前会用就可以了。
模板刚开始出现在 C++ 中时,只被当作是“代码生成器”;而发展到现在,模板经常被当作“编译期运算”的工具,即牺牲编译期的时间,提高代码在执行期的效率。
如果想深入研究的话,推荐本人认为最经典的《Modern C++ Design》(《C++ 设计新思维》,简称 MCD)。建议对自己 C++ 功底持怀疑态度的人不要读该书。一个对 C++ 功底有自信的人读该书一般有四种情况:
A、完全看不懂,或者在前两章就被它“撂倒”。这种人奉其为“天书”。
B、能看懂一半。看了此书,知道了自己 C++ 水平有多烂,而后随着读该书,C++ 水平飞速提升。
C、完全读懂。绝对超过所谓的“计算机三级”水平 n 倍。
D、理解并合理运用。被称作百里挑一的 C++ 程序员绝对一点都不夸张。
EJB
中科永联高级技术培训中心(www.itisedu.com)
EJB (Enterprise JavaBean)是J2EE的一部分,定义了一个用于开发基于组件的企业多重应用程序的标准。其特点包括网络服务支持和核心开发工具(SDK)。
在J2EE里,Enterprise Java Beans(EJB)称为Java 企业柄,是Java的核心代码,分为整体柄和片段柄和消息柄三个部分,其中的消息柄将在以后再作讨论。现在我们来看看什么是整体柄和片段柄。
整体柄是一种对象: 标准Java对象由创建它的程序创建,当程序终止时,对象也随之丢失,这就意味着当再次运行些程序时,将无法找到先前创建的柄,而整体柄会一直存在着直到它被删除。 一个程序可以创建一个整体柄,并且这个程序可以在被保存后随时停止和重启。整体柄将会依然存在。重启后,程序可以找到与之相对应的整体柄,并且会继续使用这个整体柄。
EJB实际上是SUN的J2EE中的一套规范,并且规定了一系列的API用来实现把EJB概念转换成EJB产品.EJB是BEANS,BEANS是什么概念,那就是得有一个容纳她,让她可劲造腾的地方,就是得有容器.EJB必须生存在EJB容器中.这个容器可是功能强大之极!她首先要包装你BEAN,EJB的客户程序实际上从来就不和你编写的EJB直接打交道,他们之间是通过HOME/REMOTE接口来发生关系的.它负责你的BEAN的所有的吃喝拉萨睡,比如BEAN的持续化,安全性,事务管理...
一.什么是 EJB?
一个技术规范:EJB 从技术上而言不是一种"产品"
EJB 是一种标准描述了构建应用组件要解决的:
可扩展 (Scalable)
分布式 (Distributed)
事务处理 (Transactional)
数据存储 (Persistent)
安全性 (Secure)
二.Sun 对 EJB 的期望
提供一个标准的分布的、基于 OO 的组件架构
屏蔽复杂的系统级功能需求
Write once, run anywhere
与非 Java 应用之间的互操作能力
兼容 CORBA 标准
三.为什么选择 EJB?
EJB 服务器完成"繁杂"的工作:应用开发人员关注于业务逻辑的实现而不是底层的实现机制(类似于 4GL 语言设计的目标)
支持事务处理
多个业务操作同时成功,或全部失败
可以通过在代码外的描述来定义事务处理级别
可扩展性
EJB 可以根据您应用的增长而扩展
EJB 服务器往往还提供了负载均衡和
安全性:由 EJB 服务器提供资源的访问权限控制
四.EJB 架构
为了满足架构的目标,规范中描述了
服务器 (Server)
容器 (Container)
类 (Class) 和实例 (Instance)
Home 和 Remote 接口
客户端 (Client)
五. 简化的编程模型
关注于业务逻辑实现:EJB 负责生命周期 (lifecycle), 数据存储 (persistence), 事务处理语义 (transactional semantic), 安全(security), ...
通用的编程模型:各种服务的高层 API
Java 是其编程语言
1.EJB 特点
由一个 EJB 容器在运行时创建和管理 EJB
在部署 EJB 时定制其运行方式
由 EJB 容器和服务器来协调客户端的访问
可以部署到任何兼容的 EJB 容器中
客户端对 EJB 的视图是由 Bean 开发人员决定的
2.EJB 服务器
管理 EJB 容器 (它管理 Bean)
提供对操作系统服务的存取
提供 Java 相关的服务,尤其是
通过 JNDI 访问命名空间
基于 OTS 的事务处理服务
3.EJB 容器
管理 Bean 生命周期:将 EJB 服务器提供的服务传递给 Bean
生成代码来实现对 Bean 的存取访问
强制事务处理的限制
创建、初始化和回收 Bean
管理持久数据的存储
对客户端而言 EJB 容器是透明的
4.在一个 EJB 服务器中的容器
目前容器通常是由 EJB 服务器本身提供的
在 EJB 1.0 或 1.1 规范中没有定义容器-到-服务器的接口
各厂商可以根据他们的见解来实现服务器和容器的各自责任
5.容器提供服务: 数据存储
容器决定何时载入/储存状态
Container-Managed Persistence(容器管理存储/CMP)
容器负责存储您的 Bean
容器生成必要的类和代码
Bean-Managed Persistence(Bean 管理存储/BMP)
Bean 开发人员提供存储代码
开发人员决定 如何存储, 容器仍然决定 何时进行
6.容器提供服务: 事务处理
可以由容器代理来实现
容器将得到业务逻辑方法的事务处理需求
容器提供事务控制代码
也可以由程序员通过代码实现
7.容器提供服务: 其它服务
其它服务包括
命名 (Naming)
安全 (Security)
线程管理 (Thread management)
这些服务由容器代理完成将减少应用开发人员的负担
8.分布式对象运算
远程对象被作为本地对象来处理:传递信息的方式不变,但开销更大
Enterprise JavaBeans 永远运行在服务器上:对 Bean 的访问永远是远程调用
9.Stub 和 Skeleton
由 EJB 生成:
"Stub" 对要传递出去的信息编码
"Tie/Skel" 将接受到的信息解码并传递给目标对象
10.分类: Enterprise JavaBeans
+---Entity Beans--CMP/BMP
Ejb--|
+---Session Beans--Stateful/Stateless
会话 Bean (Session Bean):根据 EJB 规范,一个会话 Bean 是:
代表单个客户端来执行
可以参与到事务处理中
不直接代表共享于数据库中的数据,但它能访问和更新这些数据
相对而言是短暂存在的
当 EJB 容器失效后就不存在---客户端需要重新建立一个信新的会话对象来继续运算
实体 Bean (Entity Bean):根据 EJB 规范,一个实体 Bean 是:
提供在数据库中数据的对象视图
允许被多个用户共享存取访问
可以是长期存在 (只要它存在于数据库中)
实体 Bean, 它的主键对象, 以及它的远程引用将能跨 EJB 容器的宕机而存在
11.EJB 类和实例
构建 EJB 应用包括来自三方的代码
开发人员编写的代码
由 EJB API 定义的类和接口
由容器自动生成的代码
开发人员编写的代码包括
Bean 类 (定义了业务逻辑)
Home 接口 (如何查找或创建 bean)
Remote 接口 (如何存取 bean)
其它组件,根据 bean 实际要求
12.EJB Home 接口
每个 bean 有一个
用于:创建新的 bean 实例、查找现存的 bean (只能是实体 bean)
Remote 接口:定义 bean 的公共接口---只有在 Remote 接口中定义的方法才能被客户端访问
EJB 客户端
可以为 servlet, JSP, 应用程序或其它 bean
通过 JNDI 来查找 EJB home 接口,步骤为:
创建一个 JNDI Context (initial context)
使用 JNDI Context 来查找 bean home 接口
使用 bean home 接口来创建/查找 bean 实例
使用 bean 实例完成业务操作
实际的存取 (对 EJB) 是通过容器生成的类来完成
EJB 架构
客户端对 bean 访问永远不是直接的
EJBObject (tie) 是由容器自身提供的:用来帮助管理 bean 的生命周期
EJB 中的角色
EJB 服务器供应商: 开发并销售 EJB 服务器
EJB 容器供应商: 开发并销售 EJB 容器
Enterprise bean 开发人员: 开发并销售 EJB
应用组装人员: 将不同的 EJB 搭建成应用
六、EJB的体系结构
目前,EJB最新的标准是2.1,EJB3.0规范正在讨论中,预计将于明年推出。EJB2.1定义了三种企业Bean,分别是会话Bean(Session Bean),实体Bean(Entity Bean)和消息驱动Bean(MessageDriven Bean)。
Session Bean用于实现业务逻辑,它可以是有状态的,也可以是无状态的。每当客户端请求时,容器就会选择一个Session Bean来为客户端服务。Session Bean可以直接访问数据库,但更多时候,它会通过Entity Bean实现数据访问。
Entity Bean是域模型对象,用于实现O/R映射,负责将数据库中的表记录映射为内存中的Entity对象,事实上,创建一个Entity Bean对象相当于新建一条记录,删除一个Entity Bean会同时从数据库中删除对应记录,修改一个Entity Bean时,容器会自动将Entity Bean的状态和数据库同步。
MessageDriven Bean是EJB2.0中引入的新的企业Bean,它基于JMS消息,只能接收客户端发送的JMS消息然后处理。MDB实际上是一个异步的无状态Session Bean,客户端调用MDB后无需等待,立刻返回,MDB将异步处理客户请求。这适合于需要异步处理请求的场合,比如订单处理,这样就能避免客户端长时间的等待一个方法调用直到返回结果。
调用一个EJB组件要比调用一个JavaBean麻烦些,由于EJB组件可以分布在多台服务器上,因此必须首先获得远程或本地Home接口,然后使用Home接口创建EJB之后就可以调用EJB的方法了。
七、EJB设计模式
常见EJB设计模式
SESsion Facade pattern
通常项目中,客户端往往需要频繁的对服务器端数据进行操作。当采用实体EJB作为数据的抽象层时,如果直接让客户端程序与实体EJB交互,会产生实现一个业务需求便需要大量的EJB属性操作(如下图1)。这直接导致如下问题:网络负载大(远程客户端时)、并发性能低、客户端与服务器端关联度大、可重用性和可维护性差、性能
因此有必要在客户端与实体EJB层间加入Session EJB层,在Sessino EJB中实现商业逻辑并封装对实体EJB的操作。(如下图2)
图1:客户端直接与实体EJB交互
图2:通过SessionEJB层实现
Session Facade模式的好处是:降低了网络负载,SessionEjb可以调用实体EJB的本地接口;将商业逻辑与商业数据隔离;维护与开发方便;显著提高性能。
Session Facade模式因其简单使用,是目前使用很广的模式。但具体应用过程中应注意:避免将所有的操作封装到一个很大的SessionEJB内;服务器端数据结构应由实体EJB实现,除非特例否则避免直接的数据库操作;SessionEjb内某些系统通用操作的代码容易重复(比如权限检查等,解决办法是将系统通用服务封装在Java Class内)。
MesSAge Facade Pattern
很多时候,一次RequeST需要操作多个EJB又不需要得到即时返回。对这种异步调用,通常应用Message Fa?ade Pattern.
这种时候,如采用Session Fa?ade Pattern存在如下问题:
1. 客户端等待返回的时间过长。一个SessionEjb的实例在完成客户请求过程中中涉及到的每一次对其他实体Ejb的调用过程中都会被锁定直到得到实体EJB返回信息后才能进行下一步操作。这样造成客户不必要的等待,并很容易因时间导致整个事务失败。
2. 系统可靠性和容错性低。如果需要调用不同系统或服务器上或多个异构数据源的多个EJB时,任何一个环节出错,均导致客户请求失败。
以Message-Driven Bean为基础的Message Facade Pattern则可以解决上述异步请求需求。具体架构见下图3
图3:使用Message Facade Pattern
Message Facade Pattern的不足之处在于:
1. Message-Driven Bean没有返回值。这样通知客户执行结果只能依赖于EmAIl或人工等其他手段。
2. Message-Driven Bean执行过程中无法将捕获的异常直接返回给客户端,即无法使客户端直接直到错误信息。
3. Message-Driven Bean通过接收Message响应客户请求,对Message内容的合法性(比如对象的类型等)依赖与客户端.容易产生运行时错误。
Message Facade Pattern经常与Session Facade Pattern在同一个项目里共同使用。
EJB Command Pattern
Session Facade Pattern中将商业逻辑实现封装在Session EJB中,这种做法带来诸多益处之外也带来如下问题:
1. 由于业务经常的变化,导致经常需要更新Session EJB代码。
2. 客户端代码不得不包含大量EJB相关的API,不利于后期项目维护。
3. 项目开发测试需要经常的EJB重部署过程。
引起上述问题的重要根结就是Session EJB本身重量级组件,其开发测试部署工作量较大,开发周期较长。以上不足可以通过EJB Command Pattern克服。
EJB Command Pattern中将商业逻辑实现封装在普通的Java ClASs(称之为Command Bean)中。该模式的具体实现有很多种,通常的框架都包括三部分:
1. Command Bean.由应用开发者写的具体实现某商业操作的Java Class.主要包含getXXX(),setXXX(),exECute()方法。
2. Client-Side Routing Logic.由多个Class组成,用于将请求转发至Command Sever,这个过程对客户是透明的。这部分代码可以跨项目使用。路由规则中可以考虑用XML技术。
3. Remote Command Server.实际执行商业操作请求。通常可以用Session EJB层实现。
整个框架见下图4:
图4:Command的基本框架
EJB Command Pattern具有如下好处:
1. 适应与需要快速开发环境。因Command Bean是轻量级的Java Class,其编译和调试比较方便。
2. 将表现层与商业实现层隔离,同时将客户端代码与EJB层隔离。
3. 将客户端代码开发与服务器端代码开发相对清晰。早期可以创建空的Command Bean方便客户端代码调试。
EJB Command Pattern的弱处在于:
1. Command Bean中对事务的控制不如Session EJB中。
2. Command Bean是无状态的。
3. 无法将异常直接返回给客户。
4. 在大项目中,由于商业逻辑复杂,常导致大数量的Command Bean存在.
5. 作为Command Server的Session EJB打包时必须包含Command Bean以致存在维护上的不便。
EJB Command Pattern的一个实际实现可以参考IBM's Command framework.
Data Transfer object Factory
基于EJB的J2EE项目,经常需要在客户端与服务器端传输大量数据。数据的组织形式常用的是DTO(Data Transfer Object,服务器端数据对象的抽象)。但因为客户端表现层经常是变化的,所需要服务器端数据也变动频繁,换句话说,DTO的数量和属性经常要更改。因此如何以及在何处生成和维护DTO便是需要考虑的问题。
一种解决方案是直接在Entity EJB中直接处理,即在Entity EJB的Bean类中加入getXXXDTO()、setXXXDTO()等。但这样做导致EJB与DTO层紧紧绑定。一旦DTO更改,与该DTO相关的EJB即需要重编译打包。EJB层与客户端层相关联不仅使维护困难而且导致EJB的重用性大大降低。
更好的解决方案是利用Data Transfer Object Factory封装对DTO的操作逻辑(如下图6)。
图6:DTO Factory示例
DTO Factory具体实现方式通常有两种:
1. 普通Java Class实现,用于Session Facade Pattern使用DTO环境下。
2. Stateless Session EJB实现,用于非EJB客户端使用DTO环境下(见图7)。
图7:SessionEJB实现DTOFactory
DTO Factory带来如下好处:
1. 使Entity EJB的重用成为可能。由于不含DTO处理逻辑,Entity EJB功能单一化,只作为数据源。不通客户端通过各自的DTO Factory可以从同一个Entity EJB得到各自所需的个性化数据(自定义DTO)。
2. 提高可维护性和性能。
3. 可以根据在DTO Factory层生成很复杂的DTO结构,诸如继承、关联关系等,而对客户端提供一个透明、细化的数据接口。
使用DTO Factory时需要注意的是:不需为每个Entity EJB定义一个Factory。可以为一系列相关的Entity EJB创建一个Factory,或者只创建一个Factory。
Generic Attribute Access
使用Entity EJB作为商业数据层时,我们首先需要从数据库加载数据,创建对应的Entity EJB实例,之后对内存中Entity EJB实例的属性进行相应操作。对属性的操作比较直接的做法是:直接调用Entity EJB的getXXX()/setXXX(),通常利用EJB2.0的本地接口;通过DTO Factory生成DTO。但这两种做法都存在如下问题:
1. 当Entity EJB的属性特别多时候,以上做法会带来复杂罗嗦的代码,使EJB变的庞大无比。
2. 使Entity EJB的客户端(比如Session EJB)和Entity EJB的接口紧密关联。Entity EJB属性的增删都需要更改客户端代码,给项目开发和维护带来不便。
事实上可以利用更通用的方式访问Entity EJB的属性,即定义Generic Attribute Access Interface。见下图8:
图8:Generic Attribute Access Interface示例
Generic Attribute Access Interface由Entity EJB的本地或远程接口实现,并利用Hash Maps传输数据。实现方式常见如下:
1. BMP类型实体EJB可以在Bean类中定义包含所有属性的私有成员变量HashMap。
2. CMP类型实体EJB可以在Bean类中可以适用Java Reflection API实现。
3. 建立一个父类,在不同的情况下定义子类重载父类方法。
使用Generic Attribute Access Interface需要在客户端与服务器端对属性以及对应的关键字建立统一的命名习惯。常见的做法如下:
1. 建立并保持良好的文档记录和命名约定。
2. 在实体EJB的实现类中定义静态成员映射属性。
3. 创建共享静态类,通过成员变量映射实体EJB属性。
4. 通过JNDI在服务器端保存属性映射关系。
Generic Attribute Access Interface的运用带来一下益处:
1. 接口实现后对不通实体EJB都适用。
2. 对属性较多实体EJB能精简代码,并更具维护性。
3. 使运行中动态增删实体EJB属性成为可能。
Generic Attribute Access Interface的缺点在于:
1. 访问EJB属性时增加了额外的操作。需要通过关键字映射属性,最后还需进行类型转换。
2. 需要建立客户端与服务器端的命名约定。
3. 因为通过HashMap操作时候需要进行类型转换,容易产生运行时类型不匹配异常。
Business Interface
EJB规范要求Bean实现类必须实现所有在远程(或本地)接口中定义的所有方法,同时不允许Bean实现类直接继承远程(或本地)接口。这就导致编译时候很容易产生两者不一致的问题,即远程(或本地)接口中定义的某方法为在Bean实现类中被实现等错误。为避免上诉错误,可以利用应用服务器厂商所提供的工具。但也可以应用EJB的设计架构来实现:定义商业接口。
Business Interface即创建自定义商业接口,在接口中定义所有EJB提供的商业方法,并让Bean实现类和远程(或本地)接口都实现该商业接口。其继承关系见下图9:
图9:商业接口的使用
Business Interface是个普通的Java Class。依赖于使用本地接口与远程接口的不通,Business Interface的定义略有不同:应用与远程接口时,在接口中的方法需要抛出java.rmi.RemoteException;而应用与本地接口时候则不需要作任何特别处理。
应用Business Interface时候必须注意一点:EJB规范不允许直接EJB的实例将对自己的引用(this对象)返回给客户端,否则编译时候即报错。但使用Business Interface后,编译时候无法检查出有无将this对象返回给客户端。这一点需要程序员自己保证。
三. 内部数据转换策略
Data Transfer Object
基于EJB的J2EE多层架构应用中,经常涉及的一个问题就是如何在各层之间传递批量数据,比如客户端对服务器端数据的批量读写操作等。比如需要得到实体EJB的属性,直接的方法是多次调用不通的属性,如下图10:
图10:低效的数据传递方式
但这种方法容易导致许多问题,比如性能以及代码的复杂度等,更有效的办法是在一个调用中得到所有需要的属性。所以可以引入Data Transfer Object来封装所需要的属性,并在客户与服务器端通过传递该对象一次实现对数据的操作。如下图11:
图11:通过DTO传递数据
DTO为普通的Java Class,通常是服务器端数据的快照。由于网络传输的需要,DTO应该实现java.io.Serializable接口。
DTO的设计有两种模型:Domain DTO以及Custom DTO。
Domain DTO仅仅实现对服务器数据的拷贝,通常与实体EJB为一对一的关系(也存在为多个相关联的实体EJB对应一个Domain DTO)。Domain DTO通常除用于读取更改实体EJB属性外也可用于创建实体EJB时候。实体EJB与Domain DTO对应关系如下图12:
图12:Account EJB 与 Account DomainDTO
Domain DTO的应用除了DTO所具有的一般优点外,还有别的益处:
1. 开发迅速。因为一旦实体EJB设计好后,很容易转换得到Domain DTO。
2. 可以利用Domain DTO的setXXX()方法在客户端进行属性有效性效验。
Domain DTO的缺点有:
1. 客户端绑定了服务器端数据模型,不利于维护。
2. 不够灵活,无法处理客户端的多样化数据要求。对一个数百个属性的实体EJB请求一个属性时候却返回一个包含所有属性值的Domain DTO明显是笨重的实现。
3. 导致代码的重复。
4. Domain DTO中如果嵌套包含了别的Domain DTO时,一旦需服务器端数据的更改而需要重定义Domain DTO模型时候异常困难。
Custom DTO则可以克服上述的一些缺点。Customer DTO仅仅封装用户感兴趣的服务器数据集即可以根据客户端需求创建Customer DTO。这样作的优点是灵活高效;缺点是大项目中可能导致大量的Customer DTO存在。
通常Domain DTO可以用于数据的更新与创建;Customer DTO可以用于客户用于表现层的数据读取。两者可以相辅相成。而且使用DTO一般与DTO Factory同时使用。
Domain Transfer Hash Map
DTO的使用往往缺乏通用性。不通的用户案例需要创建不同的DTO。当项目很复杂时,从维护性考虑需要更好的数据传输的实现方式。
Domain Transfer Hash Map即利用HashMap作为客户所需数据集的封装。好处是:
1. 良好的维护性。
2. 较大的通用性。不同的客户端可以使用相同的数据传递方式。
缺点是:
1. 需要维护客户端与服务器端在属性及其对应关键字的映射关系。
2. 当需要使用基本类型的数据时候,因为Hash Map的限制必须将基本类型先转换成对象。
3. 使用得到的数据时,需要进行类型强制转换。
Data Transfer RowSet
当需要处理直接的JDBC调用得到的结果集时,显然用DTO/Hash Map已经不合适,因为需要对大量数据进行类型转换等额外操作是很费资源和不必要的,而且最终用户常需要以表格式样显示数据。
所以对二维表式数据,更好的处理方式是利用Data Transfer RowSet。Data Transfer RowSet通过将ResultSet直接转换为RowSet传递给客户端。
在Session EJB中使用RowSet的一段示例代码如下图13:
图13:使用RowSet
使用RowSet的好处很多:
1. 接口通用于各样的数据库查询操作。
2. 当需要表格式数据显示时,因为直接从ResultSet得到,所以不需要额外的数据类型转换。
缺点是:
1. 数据库结构暴露给客户端。
2. 不符合面向对象设计思想。
3. 依赖于SQL。
Data Transfer RowSet通常用于只读式数据的显示操作,经常和JDBC for Reading Pattern连用。
四.事务和数据持久机制
JDBC for Reading Pattern
基于EJB的J2EE应用中,通过EJB对数据库的操作可以有两种方式:实体EJB或者Session EJB中直接利用JDBC访问。
客户很多时候取出数据库中数据并以表格方式显示。这种情形如果使用实体EJB会导致如下问题:
1. 引用服务器端频繁的数据库查询和加载操作。因为加载N个实体EJB总需要进行一次find()操作N次数据加载。
2. 如果使用Remote接口,引起频繁的额外网络操作。
3. 对关联关系比较复杂的数据库表结构,很难直接通过Entity EJB表现。
因此建议在只需对数据库表数据进行只读访问时候,应该采用JDBC for Reading Pattern,即通过JDBC直接访问数据库。除了避免上述使用实体EJB的缺点还带来一下好处:
1. 充分利用数据库能力,比如数据库的缓存机制。
2. 减少了对事务控制的资源。
3. 利用自定义SQL可以按需要比较灵活的读取数据。
4. 只需要一次数据查询,减少了数据库操作。
缺点是:
1. 于J2EE应用的面向对象设计相违背。
2. 因为Session EJB代码中包含了自定义SQL,维护性差。
3. Session EJB中不得不包含JDBC的API,并且需要了解数据库结构。
部属人员: 使用相应工具在运行环境下配置 EJB
系统管理员: 监视运行时情况
container是很多框架里面的一个布局容器,主要用来设置默认样式的,比如前端框架bootstrap,后端框架layui等,项目代码中都使用了这个容器。下面是软件开发中的部分知识:
瀑布模型式就是是最典型的预见性的方法,严格遵循预先计划的需求、分析、设计、编码、测试的步骤顺序进行。敏捷开发以用户的需求进化为核心,采用迭代、循序渐进的方法进行软件开发。
一、瀑布开发
瀑布模型式是最典型的预见性的方法,严格遵循预先计划的需求、分析、设计、编码、测试的步骤顺序进行。步骤成果作为衡量进度的方法,例如需求规格,设计文档,测试计划和代码审阅等等。
瀑布式的主要的问题是它的严格分级导致的自由度降低,项目早期即作出承诺导致对后期需求的变化难以调整,代价高昂。瀑布式方法在需求不明并且在项目进行过程中可能变化的情况下基本是不可行的。
需求隔离:由于各阶段的人员只能接触到自己工作范围内的东西,所以对客户需求的理解程度高低不等,开发人员更像是定义为流水线上的工人。
变更代价大:既然叫作瀑布,就意味着不应该走回头路。否则如果出现返工,付出的代价会很大。需求变更,编码人员会很强的抵触情绪。
束缚创造性:由于强调文档管理,所以管理人员会比较喜欢,但是他束缚了开发人员的创造性。
周期漫长:整个开发持续的生命周期很长,需求和设计的时间会耗费特别多,有时候会占用三分之一甚至更多时间,这样整个周期就会变长,大都在半年到一年左右的时间,所以更适合需求相对稳定的大项目。
二、敏捷软件开发
敏捷软件开发是基于敏捷宣言定义的价值观和原则的一系列方法和实践的总称。自组织、跨职能团队运用适合他们自身环境的实践进行演进得出解决方案。
敏捷开发以用户的需求进化为核心,采用迭代、循序渐进的方法进行软件开发。
缺点:
很难进行准确的资源规划,很难准确的定义“轻量的“或必要的文档,很难把握整体产品的一致性,很难预测有限的终点,很难有效地进行度量。
希望能帮到你,谢谢!
nvcontainer.exe应用程序错误
该原因和解决办法如下:1、显卡驱动程序过时、损坏或不兼容会导致 nvcontainer.exe 崩溃或出现错误。解决办法是新显卡驱动程序,访问NVIDIA官方网站,下载并安装最新的显卡驱动程序。确保选择与操作系统和显卡型号兼容的驱动程序。2、某些第三方软件与 nvcontainer.exe 冲突,或者系统文件损坏也导致错误。解决...
什么是NVIDIA Container?
NVIDIA Container是NVIDIA显卡驱动创建的一种容器技术,用于隔离GPU资源,确保运行在高性能显卡上的应用程序能够稳定运行并获得最佳性能。它通常用于运行需要高性能图形处理能力的应用程序,如游戏、设计软件等。当您的电脑开机时突然卡顿,并且发现CPU占用率满载,NVIDIA Container可能是其中一个因素。但不一定...
nvidiacontainer可以关闭吗
一些朋友在使用电脑的时候细心的发现了一个问题,那就是电脑的nvidiacontainer占用的cpu实在是太高了,问小编能不能把nvidiacontainer关闭。其实是可以的,nvidiacontainer主要用于管理自动更新、超频程序、程序监控等,关了之后不会影响显卡的。那么小编在这里就给大家带来关闭nvidiacontainer的方法。具体方法如下...
C语言程序container_of问题
container_of是内核的一个宏。你现在的错误是未定义这个宏导致的 可以自己手动添加这个宏 include<stdio.h>#include<stddef.h>#include <stdlib.h>typedef struct{int num;char a;}node;#define container_of(ptr, type, member) ({ \\ const typeof(((type *) 0)->member) *__mptr =...
Java Swing中的Container有什么用啊?
下面的是传统的写法,也就是说JFrame上是不能直接设布局、添加组件的,它上面其实是有一个面板,添加的组件是加到那个面板上。但后来的JDK简化了这一写法,你直接给JFrame添加组件,它会自动将这个动作转发给那个面板。但需要注意的是,有些操作还是必须用下面那种写法的,比如你想给窗口设置背景色,...
webcontainer使用高怎么处理
1、根据topas首先确认使用率较高的进程,是webcontainer使用高处理的第一步。2、查找当前进程正在占用cpu和TID线程信息,注意:"CP"列表示cpu占用率,从输出结果中挑出值比较高的线程。3、将ps中占用CPU率较高的这三个线程号614401、921739、1495167为10进制的,然后转成16进制的数据即可。
JAVA中的Container相关问题。。谢谢了,大神帮忙啊
对于一般的组件来说没什么区别。 但有的组件不能用frame.add();方法来加。 貌似JScrollPane就不行 所以还是用第一个吧。 === 在编程中一般也不是这样用,我习惯用这样 \/\/用继承的方式 public class Test extends JFrame{ public Test(){ initComponent(); } \/\/初始化组件 public initComponent...
C++多态性实验 定义一个抽象类—容器内container,其中定义了若干纯虚...
这样:include<iostream> using namespace std;class container \/\/定义抽象类conyainer {public:container(...)virtual xx(){}; \/\/虚函数 virtual xx(){}; \/\/虚函数 virtual void xxx() const =0; \/\/纯虚函数 private:...};class xxxx:public container \/\/公用派生类xxxx {public:vitual ...
java中一个窗口中可以建多个container内容面板吗?
可以。使用JPanel那样的容器面板。JFrame f = new JFrame();JPanel p = new JPanel(new GridLayout(2,2));\/\/2行两列的表格 for(int i=0;i<4;i++){ p.add(new JPanel());\/\/添加4个面板 } f.add(p);\/\/添加到窗口中
java.awt.container是什么意思啊
短语 East Java 东爪哇 Java coffee 爪哇咖啡 java ratio 蔗汁比例 Java quassiawood 常绿苦木 java breadfruit 爪哇面包果 awt abbr. 实际工作时间(Actual Work Time)短语 awt transform awt变换 AWT库 AWT Library AWT detector AWT检测器 AWT Library AWT库 AWT Centre 美联空运中心 container n. ...
木到布林: 详细解释一下“netkinghancong”所说的“容器就是用来装东西的”:比如说碗可以作为水的容器,油桶可以作为油的容器.同样,map 可以作为 class A 对象的容器.为了方便,C++ 中 stl 自带一些容器,map、set、vector、list、queue 等是...
市南区19165683627: 什么是服务器端程序员? - ?
木到布林: 服务器端程序员主要写业务方面,跟数据库,系统关联,一般用C#,php,JAVA等.客户端的,主要是界面设计,如CSS,html,PHOTOSHOP,JAVASCRIPT等
市南区19165683627: flash中的 container是什么意思 - ?
木到布林: 只是一个元件名而已,这里如果i正好等于1的话,那么完整的应该是 container["pic"+i]._x = 80*i; 等价于 container.pic1._x = 80*1;
市南区19165683627: java中,Container类new对象为什么不会出现图形化界面?Container类的主要作用是什么? - ?
木到布林: Container类主要是被继承的.一般使用它的子类Panel(AWT)和JPanel(Swing). Container 没有对应的native Peer.AWT组件都有对应的native peer,才能显示在屏幕上.
市南区19165683627: Shell 程序员是干什么的 - ?
木到布林: 一般shell多是指命令行式. 例如windows下的bat . linux下的bash . 在做系统维护, 文件处理分析的时候会用到. php 程序员, 多少是需要了解一些的. 例如: 安装/重启apache , mysql . 配置下网络ip , 查看php日志等. 了解一点就好(当然用人单位自然是希望越熟悉越好.) 总之 , 相对于php程序员来说. 熟悉shell 是个加分项 .
市南区19165683627: 程序员是做什么的? - ?
木到布林: 程序员通常的工作就是程序的开发以及更新和维护.常见的有网站的开发维护,APP的开发维护等等这些.
市南区19165683627: lt;div id="container">这句有什么用 - ?
木到布林: 后面的id或者class 你可以理解为 这个div的“名字”. 因为你写CSS或者JS的时候 需要用到这些 来精确到某个或某几个div. 就是 一个ID为container的div.
市南区19165683627: 程序员是做什么工作的,详细点. - ?
木到布林: 程序员(英文Programmer)是从事程序开发、维护的专业人员.一般将程序员分为程序设计人员和程序编码人员,但两者的界限并不非常清楚,特别是在中国.软件从业人员分为初级程序员、高级程序员、系统分析员,系统架构师,测试工程...
市南区19165683627: 现在C 语言程序还是很火吗,一般C 语言程序员都是做什么工作 ? - ?
木到布林: 很火啊, c语言程序员大都在系统的底层开发,比如写驱程、写系统引导等, 嵌入式开发大多数是C语言,有部分C++或汇编.
市南区19165683627: 程序员往上做是什么?软件分析师、架构师、工程师有什么区别? - ?
木到布林: 程序员:做编程的底层开发工作,写代码,不停的写代码 软件设计师:其实这个概念不太清楚,跟架构师类似,就是要分析设计这个软件的整体概念,就像盖房子要先画图纸,然后分给不同部门的人去建造,其实在现在,一般叫项目经理,或叫...