当前位置:首页 » 服务存储 » 一种通用的二维数据存储类型
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

一种通用的二维数据存储类型

发布时间: 2022-08-05 03:53:03

Ⅰ C++中有没有类似于一个集合的数据类型,可以存放一些二维数组中的数据

集合不是一种数据类型,集合是一种数据聚集描述。语言中每一种类型的本质是其所对应集合元素的条件描述。可以简单的说:任何类型都对应一种集合,表达了集合元素的共性。
那么你想做什么?
对于集合的描述的一种有效的方法称之为枚举。在C++中对应的就是枚举类型,本质上是常量的聚集声明。
对于数据结构,也可以被认为是一种类似于集合的存在,其实质是一种容器。其中stl的扩展中有一个叫做sets的容器,不知道是不是你所找的。

c语言中有哪些存储类型

c语言中的存储类型有auto, extern, register, static 这四种,存储类型说明了该变量要在进程的哪一个段中分配内存空间,可以为变量分配内存存储空间的有数据区、BBS区、栈区、堆区。

1. auto存储类型
auto只能用来标识局部变量的存储类型,对于局部变量,auto是默认的存储类型,不需要显示的指定。因此,auto标识的变量存储在栈区中。
2. extern存储类型
extern用来声明在当前文件中引用在当前项目中的其它文件中定义的全局变量。如果全局变量未被初始化,那么将被存在BBS区中,且在编译时,自动将其值赋值为0,如果已经被初始化,那么就被存在数据区中。全局变量,不管是否被初始化,其生命周期都是整个程序运行过程中,为了节省内存空间,在当前文件中使用extern来声明其它文件中定义的全局变量时,就不会再为其分配内存空间。

3. register存储类型
声明为register的变量在由内存调入到CPU寄存器后,则常驻在CPU的寄存器中,因此访问register变量将在很大程度上提高效率,因为省去了变量由内存调入到寄存器过程中的好几个指令周期。

4. static存储类型
被声明为静态类型的变量,无论是全局的还是局部的,都存储在数据区中,其生命周期为整个程序,如果是静态局部变量,其作用域为一对{}内,如果是静态全局变量,其作用域为当前文件。静态变量如果没有被初始化,则自动初始化为0。静态变量只能够初始化一次。

Ⅲ 请问高手!

EJB
中科永联高级技术培训中心(www.itise.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
系统管理员: 监视运行时情况

Ⅳ 计算机可存储的常见的数据类型有那些举例说明。

1. 字符串数据类型
char
此数据类型可存储1~8000个定长字符串,字符串长度在创建时指定;如未指定,默认为char(1)。每个字符占用1byte存储空间。
nchar
此数据类型可存储1~4000个定长Unicode字符串,字符串长度在创建时指定;如未指定,默认为nchar(1)。每个字符占用2bytes存储空间。
varchar
此数据类型可存储最大值为8000个字符的可变长字符串。可变长字符串的最大长度在创建时指定,如varchar(50),每个字符占用1byte存储空间。
nvarchar
此数据类型可存储最大值为4000个字符可变长Unicode字符串。可变长Unicode字符串的最大长度在创建时指定,如nvarchar(50),每个字符占用2bytes存储空间。
text
此数据类型可存储最大值为2147483647个字符的变长文本,并且无需指定其初始值,每个字符占用1byte存储空间,一般用来存储大段的文章。text数据类型实际上是一个Large Object数据类型,默认情况下,此类型的数据不是存储在数据行内,而是存储于独立的Large Object数据页上。另外,text数据类型不能做为函数、存储过程或触发器中的参数来用。
ntext
同text数据类型,只不过存储的是最大值为1073741823个字符的Unicode变长文本,每个字符占用1byte存储空间。
说明:无论使用哪种字符串数据类型,字符串值必须放在引号内,推荐使用单引号。
2. 数值数据类型
bit
此数据类型存储值为0或1的二进制字段。占用1byte存储空间。
tinyint
此数据类型存储0~255的整数,占用1byte存储空间。
smallint
此数据类型存储-32768~32767的整数,占用2bytes存储空间。
int
此数据类型存储-2147483648~2147483647的整数,占用4bytes存储空间。
bigint
此数据类型存储-9223372036854775808~9223372036854775807的整数,占用8bytes存储空间。
decimal/numeric
这两个数据类型功能相同,均为存储精度可变的浮点值。但推荐采用decimal,因其存储的数据“更有说明性”。此种数据类型由两个值来确定decimal(p,s),p为精度,s为标量,如decimal(3,2),其中数值2为小数的位数,那么decimal(3,2)可用来存储如1.28这样的浮点数。此种数据类型占用的存储空间取决于精度值p。p为1~9,占用5bytes存储空间;p为10~19,占用9bytes存储空间;p为20~28,占用13bytes存储空间;p为29~38,占用17bytes存储空间。

Ⅳ 通常可用二维表储存,计算机程序较容易搜索、识别和处理的数据类型被称为什么

这里的二级普通的表和通过他的内存卡来完成已成电路

Ⅵ 通常可由二维表储存计算机程序脚容易搜索识别和处理的数据类型被称为什么数据

咨询记录 · 回答于2021-11-19

Ⅶ 我想在C++中定义一个register的块(即一个二维的数据存储结构),请问怎么定义,然后怎样向他赋值啊

Register修饰符暗示编译程序相应的变量将将被频繁使用,如果可能的话,应将其保存在CPU的寄存器中,以指加快其存取速度。但是,使用register修饰符有几点限制。

首先,register变量必须是能被CPU寄存器所接受的类型,这通常意味着register变量必须是一个单个的值,并且其长度应小于或等于整型的长度。但是,有些机器的寄存器也能存放浮点数。

其次,因为register变量可能不存放在内存中,所以不能用取址符运算符“ & ”来获取取址符运算符“ &” register变量的地址。如果你试图这样做,编译程序就会报告这是一个错误。

register变量修饰符的用处有多大还受其它一些规则的影响。因为寄存器的数量是有限的,而且某些寄存器只能接受特定类型的数据(如指针和浮点数),因此,真正能起作用的register修饰符的数目和类型都依赖于运行程序的机器,而任何多余的register修饰符都将被编译程序所忽略。
实际上,许多C编译程序会忽略register修饰符,因为尽管它完全合法,但它仅仅是暗示而不是命令。
以下是它使用的注意事项:
(1)只有局部变量和形参可以作为register变量,全局变量不行。

(2)80x86系列CPU最多可使用的register变量数目有限。int型可使用8个通用寄存器。

实际上有些系统并不把register变量存放在寄存器中,而优化的编译系统则可以自动识别使用频繁的变量而把他们放在寄存器中,因此用register声明变量实际上是不必要的。我们只需要知道有这么一种变量即可。

(3)静态变量不能定义为register。

Ⅷ 在高级程序设计语言中,二维表可以采用什么存储

这要看具体的数据特点,和需要什么样的处理。
如果数据全部是同一种类型,以读取为主,可以考虑使用二维数组。
如果数据是类似于一些记录,可以使用结构体数组,例如人员信息,每一个人就是结构体数组中的一个元素。
还有些高级语言,拥有更强力易用的数据结构,例如Python中的字典,对于键值对的存储和处理非常方便。

Ⅸ 数据库数据类型有哪些

目前有许多数据库产品,如Oracle、Sybase、Informix、Microsoft SQL Server、Microsoft Access、Visual FoxPro等产品各以自己特有的功能,在数据库市场上占有一席之地。下面简要介绍几种常用的数据库管理系统。 Oracle Oracle是一个最早商品化的关系型数据库管理系统,也是应用广泛、功能强大的数据库管理系统。Oracle作为一个通用的数据库管理系统,不仅具有完整的数据管理功能,还是一个分布式数据库系统,支持各种分布式功能,特别是支持Internet应用。作为一个应用开发环境,Oracle提供了一套界面友好、功能齐全的数据库开发工具。Oracle使用PL/SQL语言执行各种操作,具有可开放性、可移植性、可伸缩性等功能。特别是在Oracle 8i中,支持面向对象的功能,如支持类、方法、属性等,使得Oracle 产品成为一种对象/关系型数据库管理系统。目前最新版本是Oracle 11g。 Microsoft SQL Server Microsoft SQL Server是一种典型的关系型数据库管理系统,可以在许多操作系统上运行,它使用Transact-SQL语言完成数据操作。由于Microsoft SQL Server是开放式的系统,其它系统可以与它进行完好的交互操作。目前最新版本的产品为Microsoft SQL Server 2008,它具有可靠性、可伸缩性、可用性、可管理性等特点,为用户提供完整的数据库解决方案。 Microsoft Access 作为Microsoft Office组件之一的Microsoft Access是在Windows环境下非常流行的桌面型数据库管理系统。使用Microsoft Access无需编写任何代码,只需通过直观的可视化操作就可以完成大部分数据管理任务。在Microsoft Access数据库中,包括许多组成数据库的基本要素。这些要素是存储信息的表、显示人机交互界面的窗体、有效检索数据的查询、信息输出载体的报表、提高应用效率的宏、功能强大的模块工具等。它不仅可以通过ODBC与其它数据库相连,实现数据交换和共享,还可以与Word、Excel等办公软件进行数据交换和共享,并且通过对象链接与嵌入技术在数据库中嵌入和链接声音、图像等多媒体数据。

Ⅹ 数据库与普通二维表的区别是什么

这个区别之大,一张纸是写不完的。
首先:存储,最根本的,普通二维表会关心她是如何存储的么,数据库最根本的属性就是持久化,所以我认为这是最基本的区别。
其次:数据格式,数据库这个概念太大了,可不仅仅是你所理解的二维表这种模式的数据库这么简单,传统意义上的数据库(关系型数据库)是由多个相互关联的类似于“二维表”的概念组合起来的,它除了包括这些表之外还要保存表之间的关系(数据之间的关系)。而且新出现的NoSQL这种数据库已完全脱离了二维表这种四班的格式,你可以看一下Google的BigTable,数据的格式连理解起来都难。
最后:维护,数据库永远离不开这个概念,为了保存数据,所有的数据库都会想方设法的增强可维护性。

可能说的不全,以上说的都是我认为最大的区别。