写在前面:
今天客户来访(日本人),问我DB2和Oracle区别。因为不是DBA(勉强的理由),我还真没有认真总结过。但我的第一感觉:一个是instance,一个是Database。建Ora库和DB2的库是不一样的。实在是はずかしい。
系统结构概述
首先,我们需要理解 Oracle 使用的架构,并理解它与 DB2 的不同之处。图 1 展示了 Oracle 的系统结构。将该图与 图 2 进行比较,后者显示了 DB2 的系统结构。在阅读本文的时候,为便于理解,可以参照这两个图。
图 1. Oracle on Linux, UNIX, and Windows Version 10.2 的系统结构
图 2. DB2 on Linux, UNIX, and Windows 系统结构
回页首
实例
在 Oracle 和 DB2 中,实例 的概念是类似的。在这两者之中,实例都是指后台进程与共享内存的组合。两者之间的主要差别在于,在 Oracle 中每个实例只能有一个数据库,而在 DB2 中多个数据库可以共享一个实例。
在 Oracle 中,由于数据库与实例是一对一的关系,因此用 CREATE DATABASE 命令创建一个数据库的同时便隐式地创建了一个实例。或者,为了在计算机上创建一个 Oracle 实例,也可以使用 Database Configuration Assistant,或者使用 ORADIM 实用程序,后者是 Oracle 9i 通过 NEW 选项提供的。另外还必须提供某些信息,包括系统标识符(System Identifier,SID)或一个服务名称、实例密码、最大用户数、启动模式等等。类似地,为了删除实例,可以使用 ORADIM 实用程序加 DELETE 选项。这里需要提供 SID 或服务名称。除非在安装过程中创建一个新的数据库,否则在以 fresh 方式安装 Oracle 的时候,不会创建缺省的实例。
在 DB2 中,当在 Windows 平台上安装了该产品之后,便缺省地创建了一个实例 "DB2"。在 Linux 和 UNIX 中,缺省的实例名称为 "db2inst1"。若要在同一台计算机上创建另一个实例,只需执行命令 de>db2icrt de>。
图 3 展示了缺省的 DB2 实例 “DB2”(在 Windows 中)和从 DB2 Control Center GUI 中用 db2icrt 命令创建的另外两个实例。
图 3. 显示 DB2 实例的 DB2 Control Center GUI
若要在命令行接口中引用给定的 DB2 实例,可以使用环境变量 DB2INSTANCE。通过这个变量,可以指定当前活动实例,所有命令将应用到此实例。例如,如果 DB2INSTANCE 被设置为 PROD,然后您执行了命令 de>create database MYDB1de>, 将创建一个与实例 PROD 关联的数据库。如果要在实例 DB2 上创建该数据库,那么必须首先将 DB2INSTANCE 变量的值改为 DB2。这类似于 ORACLE_SID (System Identifier),当用户想要在不同实例之间进行切换时,也是使用 ORACLE_SID。
还有一种标识要使用的实例的简单方法,那就是使用 DB2 Control Center GUI,如 图 3 所示。要在该工具中看到对应于新实例的条目,需要通过右击 Instances 并选择 Add 来将该实例添加到此工具中。要删除 DB2 中的一个实例,可以执行命令 de>db2idrop de>。
总 之,在 Oracle 中,可以使用 Database Configuration Assistant 来创建、修改、启动、停止和删除实例,而在 DB2 中则可以使用 Control Center GUI 做同样的事情。而且,Oracle 实例与数据库只能是一对一的关系,而在 DB2 中却不是这样。一个 DB2 实例中可以同时存在多个数据库,并且可以并发地使用这些数据库。
回页首
数据库
在 Oracle 中,可以用 CREATE DATABASE 命令手动创建数据库,也可以用 Database Configuration Assistant 创建数据库。手动创建数据库时,在执行 CREATE DATABASE 命令之前,需要执行一系列的步骤,包括设置 OS 变量,准备参数文件,以及创建密码文件。
元数据信息在 Data Dictionary 中存储和管理,由基本表和相应的视图组成。基本表是在数据库创建过程中自动创建的,而视图则是通过运行 catalog.sql 和 catproc.sql 脚本构造的。
因此,Oracle 数据库可看作包含 3 种类型的文件的一个集合:
数据文件(Data File) :包含实际的数据,数据库的物理实现。(类似于 DB2 中的容器。)
重做文件(Redo File) :相当于 DB2 中的事务日志(Transaction Log)。
控制文件(Control File) :包含用于维护和验证数据库完整性的信息。
在 DB2 中,一个实例可以包含多个数据库,如 图 2 所示。每个数据库都是一个封闭的、真正独立的单元。每个数据库有其自己的编目表空间、临时表空间和用户表空间,这些表空间是在创建数据库时缺省创建的。DB2 包含一个称为系统数据库目录(system database directory) 的二进制文件,其中包含可从 DB2 机器上连接的所有数据库的条目。这个目录保存在实例级。
当创建一个实例时,缺省情况下不会创建数据库,您需要使用 create database 命令显式地创建一个数据库。此外还可以用 Control Center 创建数据库,如 图 4 和 图 5 所示。
图 4. 使用 Control Center GUI 创建 DB2 数据库
图 5. 使用 Control Center GUI 创建 DB2 数据库(续)
在 图 5 中,您也可以看看单击 Show Command 时会出现什么情况。所有的 DB2 Control Center GUI 屏幕都会显示实际上在后台执行的 SQL 语句或命令。这些命 令可以保存在一个脚本中,以便在以后执行,或者也可以将它们复制到 Command Line Processor(CLP)或 Command Center GUI 工具中,在这些工具中执行。这些工具分别相当于 Oracle 的 SQL*Plus 和 iSQL *Plus。
可以使用 'DROP DATABASE' 命令或者在 DB2 Control Center GUI 中删除一个 DB2 数据库。而在 Oracle 中却不是使用这样的命令。数据库的删除是通过删除所有相关数据文件来完成的。
同一个实例中的数据库通常不会相互进行交互。然而,如果应用程序需要与多个数据库交互,那么通过启用联邦(federation) 支持可以满足这一需求。在 参考资料 小节中有一篇关于联邦的文章。
回页首
容器、表空间、缓冲池和页
在 Oracle 中,在物理上数据是存储在被称作数据文件(Data File)的文件中的。这类似于 DB2 的容器(container) ,DB2 的容器也是数据实际存储的地方。每个 Oracle 数据库包含一个名为 SYSTEM 的表空间,这是在创建数据库时由 Oracle 自动创建的。其他用于用户数据、临时数据和索引数据的表空间则需要在创建数据库之后另行创建,并且在使用这些表空间之前,还需要为之指定一个用户。
在 DB2 中,表空间 是逻辑对象,作为逻辑表和物理容器之间的一层。当创建一个表空间时,可以将它与一个特定的缓冲池(数据库缓存)关联起来,并关联到特定的容器。这为性能管 理带来了灵活性。例如,如果有一个 "hot" 表,那么可以在一个单独的表空间中定义它,而这个表空间又与一个独立的缓冲池相关联。这有助于确保此表中的数据连续地缓存在内存中。
在 DB2 中,使用 CREATE DATABASE 命令及其缺省值创建数据库时,同时也会自动创建三个缺省的表空间。表 1 描述了缺省的 DB2 表空间:
表 1. 用缺省值创建数据库时,缺省创建的 DB2 表空间
表空间名称
描述
SYSCATSPACE
包含元数据的编目表空间
TEMPSPACE1
用于执行连接和排序等操作的系统临时表空间。这个表空间的名称可以更改
USERSPACE1
这个表空间是可选的,如果在创建表的时候没有显式地指定表空间,那么可以用这个表空间来存储用户表
在 DB2 中,由于数据库是独立的单元,因此表空间不能跨数据库共享。由于表空间只在一个数据库中是可知的,因此两个不同的数据库可以有具有相同名称的表空间。在 图 2 中可以看到这一点,其中数据库 MYDB1 有一个名为 MYTBLS 的表空间,而数据库 MYDB2 也有一个同名的表空间。
DB2 表空间可以分为 SMS(系统管理的表空间)与 DMS(数据库管理的表空间)两类。SMS 表空间由操作系统管理,它们只能是目录。SMS 表空间可根据需要自动增长,因此 SMS 可以提供很好的性能,并且需要的管理也很少。DMS 表空间由 DB2 管理,既可以是文件,也可以是原始设备。这种类型的表空间可以提供最佳性能,但是需要进行一些管理。例如,需要预先指定想要为这个表空间分配多大的空间, 因为这种表空间不能自动增长。
Oracle 的存储模型中没有 SMS 的概念,但是它的数据文件类似于 DB2 DMS 表空间。也就是说,可以通过增加数据文件的大小,或为表空间添加数据文件,或者通过添加一个新的表空间,来增加数据库的大小。
表 2 显示了 Oracle 数据库或表空间与 DB2 数据库或表空间的对应关系。
表 2. Oracle 数据库与 DB2 数据库和表空间的对应关系
Oracle 数据库或表空间
DB2 数据库或表空间
SYSTEM 是存放编目(数据字典)信息的表空间
SYSCATSPACE(编目表空间);和在 Oracle 中一样,仅在数据库级保存该信息
Data Dictionary(包含表和视图形式的元数据),驻留在 SYSTEM 表空间中
系统编目表(由 SYSIBM 模式标识),系统视图(由 SYSCAT 或 SYSSTAT 模式标识),驻留在 SYSCATSPACE 表空间中
SCOTT 数据库
SAMPLE 数据库
TEMP 表空间
System Temporary 表空间(缺省情况下名为 tempspace1)
UNDO 表空间
N/A
USER 表空间
用户表空间。缺省情况下,USERSPACE1 一般是在数据库创建之后才创建的
前面已指出,Oracle 的数据缓冲区概念相当于 DB2 的缓冲池。但是,DB2 允许多个缓冲池存在。在 DB2 中不需要预先定义可创建的缓冲池的数量,缓冲池的名称可以是任意的。
Oracle 中块(block) 的概念与 DB2 中的页最为相似。一个 DB2 页的大小可以为 4k、8k、16k 或 32k。表中的一个行只能放在一个页中,而不能像 Oracle 中那样跨多个页。
回页首
对象名称
Oracle 中的对象名称形式如下:
de>[Schema_name.]object_name[@database]de>
在 DB2 中,对象名称也是由两部分组成的结构:
de>Schema_name.object_namede>
和 在 Oracle 中一样,DB2 模式名称用于在逻辑上组织对象。但是两者之间一个重要差异是,在 DB2 中,模式名称不一定与一个用户 id 相匹配。任何拥有 IMPLICIT_SCHEMA 权限的用户都可以用一个不存在的模式创建对象。例如,假设 “Peter” 具有 IMPLICIT_SCHEMA 权限,他执行以下命令:
de>CREATE TABLE WORLD.TABLEA (lastname char(10))de>
该命令创建表 WORLD.TABLEA,其中 WORLD 是新创建的模式。如果 Peter 没有显式地指定模式,那么该命令就会创建表 PETER.TABLEA,因为缺省情况下是使用连接 ID。
在 DB2 中,在发出与数据库相关的命令之前,总是要连接到数据库。因此,在这种架构下,对象名称不需要包括数据库名称。
回页首
表、视图和索引
在 Oracle 和 DB2 中,表、视图和索引基本上是一样的。
DB2 提供了一个名为 Design Advisor 的实用程序,可以用它来为特定的查询或工作负载推荐索引。Design Advisor 可以从 DB2 Control Center 中调用,也可以从 DB2 CLP 中使用 db2advis 命令来调用。在 DB2 中,索引是直接与表定义绑定的。例如,当使用 DMS 表空间时,可以用下面的语句指定索引存放在哪个表空间:
de>CREATE TABLE mytable (col1 integer, col2 char(10)) in tbls1 index in tbls2de>
上面的例子表明,表中的数据将存储在表空间 'tbls1' 中,而索引页将存储在表空间 'tbls2' 中。但在 Oracle 语法中,CREATE INDEX 语句有一个选项来指定索引存放在哪个表空间。
此外,在 DB2 中,索引一旦创建好,便不能修改索引定义中的任何子句。为了进行更改,需要删除索引,然后重新创建索引。
和在 Oracle 中一样,不同数据库中的 DB2 表、视图和索引可以有相同的名称。相同数据库中的表和视图则必须使用不同的名称,但是允许使用与已有的表或视图相同的名称创建索引。
回页首
存储过程、触发器和用户定义函数(UDF)
在 Oracle 环境中,有很多方法来创建和访问存储过程、触发器和函数。PL/SQL 是 SQL 的面向对象(OO)过程扩展,支持数据操纵(DML)、流控制、变量和常量的声明、过程和函数定义以及 OO 数据类型,例如嵌套表和变长数组(varray)。Oracle 还将 JVM 并入到它的引擎中。在 Oracle 数据库中,可以使用 SQLJ 将存储过程、函数和触发器,作为类来创建、存储和执行。Oracle 还支持 Type 1 至 4 的 JDBC 驱动程序。
DB2 存储过程可以用 DB2 预编译器支持的任何语言编写,包括 Java、C、C++、REXX、Fortran 和 COBOL。但是,我们推荐您使用 SQL Procedural Language(SQL PL),这种语言非常类似于 Oracle 的 PL/SQL。在开发 SQL PL 存储过程时,需要一个 C 编译器,因为这种存储过程首先要转换成 C。存储过程的 C 实现可以提供性能优势,因为代码只需编译一次(在 unfenced 模式下性能优点尤其明显)。但是,在开发这种存储过程时,开发系统上需要一个额外的 C 编译器。在 DB2 将来的版本中,有望出现不需 C 编译器支持的 SQL PL 存储过程。DB2 存储过程开发还利用 Type 1 至 4 的 JDBC 驱动程序来支持 SQLJ 和 Java。
触发器和函数的开发可以使用内联 SQL/PL,这种方法不需要 C 编译器。这种方法支持 SQL PL 语句的一个子集。另外还可以使用 DB2 Development Center Tool 来简化 DB2 存储过程和用户定义函数的创建、构建、调试和部署。
回页首
配置文件
传 统上,Oracle 将所有与会话和系统相关的参数存储在一个文本文件中,这种文件通常被称做 initSID.ora。但是,由于这种文本文件不具有持久性,从 Oracle 9i 开始,Oracle 引入了 Server Parameter File(SPFILE),这是一种存储在服务器上的二进制参数文件。它在实例停止之后到启动之前这个过程中是持久存在的。不过,当 SPFILE 不可用的时候,仍然使用 initSID.ora 文件。引入 SPFILE 之前,任何对参数有影响的 ALTER SYSTEM 和 ALTER SESSION 命令都只能在实例或会话活动期间持久。每当数据库实例需要回弹(rebound)时,DBA 都必须手动修改 initSID.ora 文本文件。对于侦听器,网络访问配置通常存储在 listener.ora 中;对于客户机访问,网络访问配置通常存储在 tnsnames.ora 中。
在 DB2 中,配置参数也是存储在实例级和数据库级,在实例级是数据库管理器(database manager) 配置文件,在数据库级是数据库 配置文件。这些参数大多数都可以动态地更改,也就是说,不需要为了使对参数值的更改生效而停止并重启实例或者重连所有连接。
如果想在 CLP 中手动更改特定的数据库管理器配置参数,可以使用命令 de>UPDATE DBM CFG USING de>。
如果想在 CLP 中手动更改特定的数据库参数,可以使用命令 de>UPDATE DB CFG FOR USING de>。
这两个命令分别相当于 Oracle 的 ALTER SYSTEM 和 ALTER SESSION。或者,也可以使用 Control Center 查看和修改这些参数的值。如果右键单击一个给定的实例,并选择 Configure Parameters ,那么可以看到 图 6 中显示的窗口。
图 6. DB2 Database Manager 配置参数(实例级)
在数据库级,右击一个给定的数据库,并选择 Configure Parameters ,则可以看到 图 7 中显示的窗口。
图 7. 数据库配置参数(数据库级)
DB2 提供了很多用于配置系统的参数。但是,如果想通过一种容易的方法自动配置系统,那么可以使用 de>autoconfigurede> 命令(或者 Configuration Advisor GUI),它会根据您提供的一些信息将数据库管理器配置参数和数据库配置参数设置成最佳值。图 8 显示了 Configuration Advisor。
图 8. DB2 Configuration Advisor
除了配置文件外,DB2 通常还为与平台相关的配置使用 DB2 注册表变量。注意,DB2 注册表变量与 Windows 注册表没有任何关系 。可以使用命令 db2set 查看和更改这些变量。
连接(网络访问)信息存储在 System 数据库目录、本地数据库目录和节点目录中。这些都是二进制文件,只能用 CATALOG 和 UNCATALOG 命令修改。
回页首
内存架构和后台进程
接下来,我们来看看内存架构和后台进程,并且比较一下 Oracle 和 DB2 中内存架构和后台进程的不同之处。
图 9. Oracle 内存架构和后台进程
Oracle 中的 System Global Area (SGA)是一组共享内存块,用于存储与实例有关的信息。其中包括语句缓存、重做日志缓冲区和数据缓冲区缓存。Program Global Area (PGA)和 User Global Area (UGA)共享内存块,包含用于服务器进程和用户会话的数据和控制信息。
Oracle 支持在同一台计算机上存在多个实例,但不允许共享后台进程。例如,同一台计算机上的三个实例就需要三组后台进程。因此建议在一台计算机上包含一个数据库、一个实例和多个模式。
图 10. DB2 内存架构和后台进程
DB2 和 Oracle 都使用共享内存块,但是 DB2 与 Oracle 内存架构的实现方式略有不同。由于 DB2 实例可以包含多个数据库,因此存在两个级别的配置。在前一节已经提到,实例级的配置可以在 DBM CFG 文件中完成,而数据库级的配置则可以在 DB CFG 文件中完成。这两个级别上的配置参数都可以进行调整,以调优内存使用情况。后文将更详细地阐述 DB2 的内存结构和不同的后台进程。
Oracle 是在实例和数据库启动时将内存分配给它们的,而 DB2 则是在不同级别上分配内存。这主要是因为 DB2 实例可以包含多个数据库。DB2 中主要有三种内存结构:
实例共享内存 :这是数据库管理器全局共享内存,是在使用 de>db2startde> 命令启动实例时分配给实例的,并且在发出 de>db2stopde> 命令停止实例之前,一直处于已分配状态。
数据库共享内存 :这是数据库全局内存,是在激活数据库或者第一次连接到数据库时分配的。分配的内存包括缓冲池、锁列表、数据库堆、实用程序堆、包缓存和编目缓存。
应用程序共享内存 :这是在应用程序连接到一个数据库时分配的内存,由处理连接到数据库的客户机所请求的工作的代理使用。每个连接到数据库的应用程序都会被分配内存;因此,对会影响应用程序共享内存的参数的正确配置就非常重要。
在 DB2 for Windows 中,服务器活动是以线程的形式进行的,而在 Linux 和 UNIX 环境中,这些活动是以后台进程的形式来实现的。DB2 有以下几种级别的进程:
实例级:这些进程是在实例启动时初始化的:
DB2 Daemon Spawner (db2gds):全局守护处理程序,每个实例都对应一个这样的进程(仅在 UNIX 中)
DB2 System Controller (db2sysc):DB2 主进程。
DB2 Watchdog (db2wdog):所有其他进程的父进程。
DB2 Format Log (db2fmtlg):类似于 Oracle 中的 ARCn 进程,为日志路径中的日志文件预先分配空间。
数据库级:这些进程是在建立到数据库的连接时初始化的:
DB2 Log Reader (db2loggr):类似于 Oracle 的 PMON 进程的一个子集。该进程在回滚、重启恢复和前滚期间读取日志文件。
DB2 Log Writer (db2logw):将日志从日志缓冲区刷新到磁盘上的事务日志文件中。相当于 Oracle 中的 LGWR 进程。
DB2 Page Cleaner (db2pclnr):相当于 Oracle 中的 DBWR 进程,该进程在将页从磁盘上转移到 BP 中之前,清理缓冲池。
DB2 Prefetcher (db2pfchr):将需要用到的页预先从磁盘取出到缓冲池中。
DB2 Deadlock Detector (db2dlock):死锁检测器进程。
应用程序级:每个连接到数据库的应用程序,都具有属于它自己的应用程序级后台进程与之相关联。这些进程有:
DB2 Communication Manager (db2ipccm):进程间通信进程,用于每个本地连接的客户机。
DB2 TCP Manager (db2tcpcm):TCP 通信管理器进程,用于使用 TCP/IP 连接数据库的远程客户机。
DB2 Coordinating Agent (db2agent):代表应用程序处理所有请求的进程。
DB2 Subagent (db2agnta):空闲子代理。
Active Subagent (db2agntp):在启用了 SMP 并行的情况下使用的活动子代理,它使一个任务可以使用多个进程。
要获得对 DB2 进程的完整解释,请参考文章 “DB2 通用数据库进程全接触”。
回页首
锁机制
Oracle 中的锁可以是手动的,也可以是自动的。Oracle Lock Manager 可以在行级隐式地锁定表数据,此外也可以使用以下 SQL 语句在事务或会话级覆盖缺省的锁: de>1. SET TRANSACTION ISOLATION LEVELde> de>2. LOCK TABLEde> de>3. SELECT FOR UPDATEde>
Oracle 支持一种称为 Multi-Version Read Consistency 的机制,这是用 undo 段中的 undo 数据实现的。
DB2 实现 ANSI 标准隔离(Isolation)级别,例如未提交读(Uncommitted Read)、游标稳定性(Cursor stability)、读稳定性(Read stability)和可重复读(Repeatable Read)。除非使用未提交读隔离级别,否则用户只能看到已提交的数据。行锁是根据隔离级别隐式地获得的。可锁定的数据库对象有表空间、表和行,但是,只 有表和表空间可以显式锁定。可使用 de>LOCK TABLEde> 命令来锁定一个表,而不是使用缺省的行锁定。
与 Oracle 不同,在 DB2 中,锁是存储在内存中的,而不是存储在数据页中。可以使用 LOCKLIST 数据库配置参数来配置锁可用的内存,而 MAXLOCKS 配置参数则定义用于一个特定应用程序的锁的最大内存。
回页首
安全性
Oracle 和 DB2 都是具有基本的和高级的安全特性的安全数据库。Oracle 中有 4 种不同的用户身份验证方法:
数据库 :数据库执行对用户的识别和身份验证。
外部 :操作系统或网络服务执行身份验证。
全局身份验证和授权 :由 SSL 对用户进行全局身份验证。
代理身份验证和授权 :中间层服务器执行身份验证。
身份验证方法是在使用 de>CREATE USERde> 命令创建用户时指定的。Oracle 中有一些 Data Dictionary 视图,其中包含了关于这些用户的信息。
在 DB2 中,用户不是存在于数据库中,而是由操作系统来管理。没有数据库登录信息存放在数据库表中。任何操作系统用户都有可能访问 DB2;但是,除非他们被授予了给定的 DB2 权限或特权,否则他们能做的事情不多。通过 Control Center GUI 很容易授予和撤销权限和特权。不过首先需要将可用操作系统用户或组中的一个用户或组添加到 Control Center。
在 DB2 中没有 “角色(role)” 这个术语。相反,DB2 使用术语 “权限(authority)”,它类似于 Oracle 的数据库角色,DB2 通过权限将特权授予某些组或用户。DB2 支持的权限有:SYSADM、SYSCTRL、SYSMAINT、DBADM 和 LOAD。
不能使用 GRANT SQL 语句授予 SYSADM、SYSCTRL 和 SYSMAINT 权限。这些特殊的权限只能在数据库管理器配置文件中设置。
DB2 还使用术语 “特权(privilege)”,它类似于 Oracle 的系统和模式对象特权。DB2 中有数据库特权 (连接、创建表等)和数据库对象特权 (模式、表、视图等)。图 11 显示了从 Control Center GUI 获得的 DB2 安全性信息。Change User 窗口中显示的大部分选项卡对应了 DB2 所支持的特权。
图 11. DB2 安全性
Oracle 10g 的安全性大体上没有变化,只有部分增强。下面是 Oracle 10g 中的增强的列表:
FGA 的 DML 支持 —— 细粒度审计(fine-grained auditing,FGA)的 SQL 支持得到了增强,现在支持查询和 UPDATE、INSERT 和 DELETE 操作这些粒度上的审计。
SASL 上的通信 —— 该特性为 Oracle Internet Directory(OID)与数据库之间或者两个数据库之间的通信提供了一种安全通道。如果您的企业部署通过密码进行身份验证的用户,那么也就不再需要 在公共密钥基础设施(PKI)方面投入资金和管理工作。SASL(Simple Authentication and Security Layer)通信提供了等价的安全通道。
统一用户模型 —— 目录中定义的单点登录(single sign)用户现在可以使用 Enterprise User Security 提供的特性。不需要为供应和凭证管理而执行附加的任务。此外,Enterprise User Security 的管理组现在可以指派一个所有者,这促进了整体上更有力的安全性。
轻松的数据库注册 —— 该特性消除了对 RDBMS_SERVER_DN 参数的需要,使得企业用户的配置更为轻松。
扩展的、统一的审计跟踪 —— 该特性以标准的、细粒度的审计表的形式,为 RDBMS 审计提供了一致的审计跟踪,改进了安全性管理。事务和 SQL 信息也被添加到审计表中,以便进一步提高所有用户的可问责性(accountability)。
Oracle 标签安全性目录集成 —— 现在可以在一个中央 OID/LDAP 储存库中管理 Oracle Label Security 策略和用户标签授权。这节约了管理成本,同时也消除了多个管理点,从而增加了安全性。
DB2 中的身份验证不仅涉及对用户名和密码进行加密,还允许对客户机与服务器之间传输的数据进行加密。身份验证的位置由数据库管理器配置参数 AUTHENTICATION 的值决定。
下面是用于启用 DB2 的身份验证的有效选项:
SERVER_ENCRYPT —— 这个值规定身份验证发生在服务器上。首先加密连接期间指定的用户 id 和密码,然后将它们发送到服务器,在服务器上将它们与服务器端的用户和密码进行比较。如果匹配成功,那么用户就被允许访问数据库。
KRB_SERVER_ENCRYPT —— 规定服务器接受 KERBEROS 身份验证或加密的 SERVER 身份验证模式。
DATA_ENCRYPT —— 规定服务器允许 SERVER 身份验证,并且对客户机与服务器之间通过网络传输的数据进行加密。
DATA_ENCRYPT_CMP —— 规定服务器接受加密的 SERVER 身份验证模式和用户数据的加密。 这种身份验证类型能与不支持 DATA_ENCRYPT 身份验证类型的下级产品兼容。
GSS_SERVER_ENCRYPT —— 规定服务器接受基于 GSS API 的插件身份验证或加密的服务器身份验证模式。
若要更新 AUTHENTICATION 实例参数,例如将它的值设置为 DATA_ENCRYPT,可以使用以下命令:
清单 1. 更新 AUTHENTICATION 实例参数
UPDATE DBM CFG USING AUTHENTICATION DATA_ENCRYPT db2stop db2start
DB2 提供了基于标签的访问控制(Label Based Access Control,LBAC)机制,从而进一步扩展了安全性。 LBAC 特性为控制对各行和各列的读写访问提供了更大的粒度。 DB2 中提供了一种新的安全管理员角色(SECADM),用于操纵 LBAC 对象。
试图访问一个对象的用户必须被授予该对象的安全标签。如果安全标签匹配,则允许访问;如果不匹配,则拒绝访问。 实现 DB2 中的 LBAC 安全性基本上有三个步骤:
创建安全策略。 安全策略描述用于决定谁可以访问特定数据的凭证。任何一个表只能由一个安全策略来保护,但是不同表可以由不同的安全策略来保护。这是通过使用 CREATE SECURITY POLICY 语句来实现的。安全策略的所有管理都是通过使用 SQL 语句来完成的。
创建安全标签。 一共有三种类型的安全标签:
行安全标签 。与数据库表中的一个数据行或记录相关联的安全标签。
列安全标签 。与数据库表中一个列相关联的安全标签。
用户安全标签 。为数据库用户授予的安全标签。
安全标签由 SECADM 创建,作为策略的一部分。 创建好一个安全标签之后,可以将其与表中各个列和行相关联,以保护存放在那里的数据。
为用户授予安全标签,使他们可以访问数据 。 安全管理员通过为用户授予安全标签来允许他们访问受保护的数据。 当一个用户试图访问受保护的数据时,DB2 将那个用户的安全标签与保护数据的安全标签进行比较。
除了特权和权限外,数据库安全性还包含其他方面。简单地说,Oracle 与 DB2 之间既有不同点,也有相同点:
用户身份验证和授权
Oracle 在创建用户之后,使用存储在目录中的加密密码。DB2 支持用于用户身份验证的密码,并使用底层的操作用户进行身份验证。Oracle 和 DB2 都支持 LDAP (Oracle Internet Directory 与 IBM Directory Server)。Oracle 和 DB2 都支持单点登录(SSO)。
数据加密
Oracle 支持数据加密,它可以对敏感数据,例如信用卡号和一些高度敏感的商业数据进行加密。DB2 允许列级的数据加密。
网络加密
Oracle 通过它的 Oracle Advanced Security 提供网络加密。Oracle 使用 DES、3DES 和 RC4 业界标准加密。DB2 本身不进行网络加密。但可以使用附带的 Tivoli SecureWay 实现网络加密。
审计跟踪
Oracle 允许审计跟踪用户和对象。还可以使用日志挖掘程序调查和分析有疑问的查询。DB2 也提供了类似的审计设施。在 DB2 中,可以使用 db2audit 实用程序进行审计跟踪。
回页首
DB2 9 pureXML 特性
在本节中,我们将 Oracle 对 XML 的支持与 DB2 对 XML 的支持进行比较。 Oracle XML DB 特性随 Oracle 9i Release 2 一起发布,借助该特性,通过定义 XMLTYPE 表和列,将它们存储为 CLOB 或拆分(分解)到关系表中,可以实现对 XML 存储、检索和模式的管理。 Oracle 10g 为管理 XML 文档提供了一些增强。例如,通过映射已有的数据,可以动态地反映模式的更改,而不必重新导入。Oracle 10g 包括一些工具包,例如:
XML-SQL Util(XSU) —— 为 PL/SQL 和 Java 提供的接口。
XML Developer's kits(XDK) —— 用于受支持的语言,例如 PL/SQL、C++ 和 Java。
Oracle 10g 仍然是一种 支持 XML 的 数据库。它提供的所有接口、API 和包,都是为了减轻 XML 与关系表之间的相互转换和映射所带来的负担、复杂性和维护。支持 XML 的数据库,不管是使用 CLOB 还是分解方法,都不能提供良好的性能。例如,在使用 CLOB 的情况下,XML 文档作为镜像文件存储在数据库中。您可能已经知道,镜像文件的管理是很麻烦的。分解方法在性能方面也不如人意。将一个 XML 文档分解成小块并存储在多个表中之后,当需要将 XML 文档组合成原样时,就不得不使用一个 SQL JOIN 操作。SQL 中的 JOIN 是开销很大的,特别是表的数量较多时这一点尤其明显。保持数字签名的保真度同样也是一个挑战。
另一方面,DB2 9 pureXML 技术则是原生存储 XML 文档,也就是说,在内部以树型格式存储 XML 文档。它还允许同时使用 SQL 和 XML 扩展,即 Xquery 和 Xpath 来访问关系数据和 XML 数据。原生存储 XML 文档是一种更好的方法,IBM 的研究表明,使用该方法在 XML 文档的搜索和检索方面可以取得更好的性能,并且能减少某些程序中代码的行数。
要在数据库中使用 pureXML 特性,在创建数据库时要使用 UNICODE(例如使用编码集 UTF-8)。在创建一个表之前,如果没能创建一个 UNICODE 数据库,则会产生如下所示的错误:
SQL1239N XML features can only be used in a Unicode database with a single database partition. SQLSTATE=42997
DB2 与之前版本一样存储关系数据。但是,XML 数据是以分层格式存储的(作为使用 Xquery 数据模型的一棵树)。XML 与关系服务之间是紧密集成的。为了存储 XML 文档,用户需要创建一个表,并指定一个列使用一种新的数据类型,即 XML ,如下面的例子所示。
清单 2. 用 XML 数据类型创建表
create table T (i int, doc xml)
下图展示了这两列的显示效果:
图 12. DB2 存储模型
由于 XML 文档是以解析的分层格式存储在 XQuery Data Model (XDM) 中的,因此不需要进行转换或映射。用于存储 XML 文档的格式就是用于处理 XML 文档的格式。这样可以提供更好的性能。
备份、恢复、导入等实用程序对含 XML 列的表的作用与其他表是一样的。可以使用 INSERT 语句或 IMPORT 实用程序(注意:DB2 LOAD 实用程序还不支持 XML)将 XML 数据插入 XML 列。在导入来自第三方的 XML 文档之前,最好根据一个预定义的 XML 模式验证这些文档。 为了注册一个 XML 模式,DBA 需要执行 REGISTER XML SCHEMA 命令,并以 COMPLETE XML SCHEMA 结束,以完成注册过程。 DB2 9 还支持在一个 XML 文档的子集或整个文档上创建索引。在创建索引时,需要指定 XPATH,它将指向被建索引的特定元素/属性。
在 DB2 9 中,有四种方法来访问关系数据和 XML 数据,如 图 13 所示:
纯 SQL(不涉及 XQuery)
SQL/XML,也就是说嵌入在 SQL 中的 XQuery
XQuery 作为独立的语言(不涉及 SQL)
带嵌入式 SQL 的 Xquery
图 13. 可能的 PureXML 查询
表 3 比较了 DB2 9 与 Oracle 10g 的 XML 功能。
表 3. XML 特性比较
XML 功能
Oracle 10g
IBM DB2 9 for Linux, Unix and Windows
支持 XML 的存储
√
不适用
XML 原生存储
×
√
大环境的易维护性
×
√
高度可伸缩性
×
√
将 XML 文档存储为 CLOB
√
√。但是从长远看,鼓励使用 XML 原生存储
分解
√
√。但是从长远看,鼓励使用 XML 原生存储
要看到更深入的讨论,可以在 developerWorks 上找到更多关于 IBM pureXML 功能的文章,例如 使用 XQuery 查询 DB2 XML 数据 和 使用 SQL 查询 DB2 XML 数据。
回页首
表分区
DB2 的表分区(即区域分区)类似于 Oracle 的分区。它基本上允许将一个逻辑表拆分成跨一个或多个表空间的多个物理存储对象。每个对象对应于一个 “分区”,允许每个表空间包含一定范围的、很容易访问的数据。
在 DB2 中,有多种方法对数据进行分区,您可以同时将这些方法应用于相同的数据。为了避免读者感到困惑,下面简单地解释一下提供这种分区的各种不同方法:
DATABASE PARTITIONING —— 按照键散列将数据分布在数据库的多个逻辑节点上(DPF)。
RANGE/TABLE PARTITIONING(DB2 9 提供) —— 根据键区域将数据划分到一个逻辑数据库分区中的多个物理对象上。
MULTI DIMENSIONAL CLUSTERING(MDC) —— 根据多个键值组织表(或一个表中的区域)中的数据。
利用 DB2 9 中新引入的表分区特性,可以根据一个或多个表列中的特定值将表数据划分到不同的表空间。 这些分区可以独立地进行备份和恢复,可以提高某些查询的性能,因为 DB2 优化器知道这些分区的存在,并且可以避免对查询中不需要的分区进行扫描。例如,如果按一年的四个季度对表进行分区,并且查询只需要第 4 季度的数据,那么 DB2 将不解析前三个季度,而是直接找到第 4 个季度并解析之。这被称作分区排除(partition elimination)。
如前所述,在 DB2 9 中,数据组织的三种方法,即数据库分区(Database Partitioning)、表分区(Table Partitioning)和多维集群(Multi Dimensional Clustering)可同时使用。
下面的例子创建一个 customer 表,其中 l_shipdate >= '01/01/2006' 且 l_shipdate <= '03/31/2006' 的行存储在表空间 ts1 中,l_shipdate >= '04/01/2006' 且 l_shipdate <= '06/30/2006' 的行存储在表空间 ts2 中,依此类推。更详尽的解释可以参阅 developerWorks 文章 Table partitioning in DB2 9。 清单 3. 将一个表按区域分区
CREATE TABLE customer (l_shipdate, l_name CHAR(30)) IN ts1, ts2, ts3, ts4, ts5 PARTITION BY RANGE(l_shipdate) (STARTING FROM ('01/01/2006') ENDING AT ('12/31/2006') EVERY (3 MONTHS))
回页首
行压缩特性
Oracle 提供了两种压缩特性:一种是索引级压缩,另一种是表级压缩。如果对这些特性没有适当的规划,就会对性能产生不良影响。
Oracle 从版本 8i 开始就引入了索引压缩。可以压缩的索引有 bitmap、btree 和索引组织的表。索引压缩使用起来很简单。例如,要用压缩特性创建一个索引,可以使用如下代码: 清单 4. 用压缩特性创建索引
CREATE INDEX ord_customer_ix_demo ON orders (customer_id, sales_rep_id) COMPRESS 1;
对于不是在内部用压缩特性创建的索引,可以通过修改它们将它们转换成压缩索引。下面显示了一个示例,这个示例展示了如何修改索引,以使其变成压缩索引。
清单 5. 用压缩特性修改索引
alter index ord_customer_ix_demo rebuild compress
目前,Oracle 没有提供任何自动化的建议者程序来指出哪些索引应该被压缩。大多数通过索引压缩获得的好处,都需要拥有娴熟的 Oracle CBO 知识的资深 DBA 经过适当规划才能获得。
另一方面,表压缩是在 Oracle 9i release 2 中引入的。它可以用于压缩整个表、表分区和具体视图。压缩可应用于所有分区或部分分区。 虽然表压缩也可以用于未分区的表,但是在 OLTP 工作负载中将表压缩应用于未分区的表并不可取,因为插入和更新性能会受到影响。在 Oracle 表压缩中,数据库块中重复的值将被去除,信息将被存储起来,以便在块中重新创建未压缩的数据。 下面的例子展示了如何用压缩特性创建分区表。 清单 6. 用压缩特性创建表
CREATE TABLE costs_demo ( prod_id NUMBER(6), time_id DATE, unit_cost NUMBER(10,2), unit_price NUMBER(10,2)) PARTITION BY RANGE (time_id) (PARTITION costs_old VALUES LESS THAN (TO_DATE('01-JAN-2003', 'DD-MON-YYYY')) COMPRESS, PARTITION costs_q1_2003 VALUES LESS THAN (TO_DATE('01-APR-2003', 'DD-MON-YYYY')), PARTITION costs_q2_2003 VALUES LESS THAN (TO_DATE('01-JUN-2003', 'DD-MON-YYYY')), PARTITION costs_recent VALUES LESS THAN (MAXVALUE));
为了将一个表转换成压缩表,可以使用
alter table move compress。但是,压缩表不允许添加或删除列。
至于 DB2,在 DB2 9 之前就有一些压缩方法,但是,行压缩是在 DB2 9 中才引入的。行压缩要求创建一个目录,用于存储重复模式或条目以及数字键。压缩算法足够智能,不会压缩那些对节省磁盘空间帮助不大的行。
DB2 的行压缩不像 Oracle 的键压缩,它不需要指定键。
可以通过 CREATE TABLE 或 ALTER TABLE 命令在表级进行压缩。例如: 清单 7. 用 COMPRESSION YES 创建/修改表
CREATE TABLE Sales COMPRESS YES ALTER TABLE Sales COMPRESS YES
为了在 DB2 Control Center 中取得相同的效果,在列定义过程中(表创建向导中的第二步),应确保选中面板底端的复选框 Store table data in a compressed format (如下图所示)。
图 14. DB2 Control Center —— 以压缩格式创建表
只有在执行 REORG 的时候才构建表字典,之后便可以压缩表中的数据。在随后的每次 REORG 操作中,表字典随之更新。被压缩的数据同时存放在磁盘上和内存中,DB2 还压缩存储在日志文件中的用户数据,以便减少日志文件大小。
注意,分区表的每个分区可以有不同的压缩字典,在 DPF 中的一个表的每个分区也可以有不同的压缩字典。
除了数据行压缩,DB2 9 提供的其他压缩机制还包括:
NULL 值和缺省值压缩(V8 GA):对变长列中的零长度空数据和系统缺省值进行压缩。
多维集群(V8 GA):使用块索引,数千个记录共用一个索引条目,实现索引压缩。
数据库备份压缩(V8 FP4):通过压缩产生较小的备份镜像。
XML 解析
回页首
自治特性
从 Oracle 9i 到 10g,Oracle 在调优方面作了一些改进。Oracle 将以下方面的调优进行了自动化:
Redo Logfile Sizing Advisor —— 该特性就重做日志文件的最佳大小给出建议,以避免因频繁出现的检查点而导致过多的磁盘 I/O。
Automatic Checkpoint Tuning —— Oracle 数据库现在可以自调优检查点,以取得良好的恢复速度,同时减少对正常吞吐率的影响。 这样便不再需要设置任何与检查点相关的参数。
Automatic Shared Memory Tuning —— Automatic Shared Memory Tuning 通过自调优算法将 System Global Area (SGA) 内存相关参数(缓冲区缓存、共享池)的配置自动化。它简化了数据库的配置,确保可用内存得到最有效的利用,并提高了性能。
Transaction Rollback and Recovery Monitoring —— 该特性便于估计回滚一个事务要花多少时间。还可以监控被恢复的事务的进程,并估计事务恢复的平均速度。
Oracle 还提供了一些 advisor,例如 segment advisor 和 undo advisor。segment advisor 根据对象内的空间拆分程度给出是否可以对一个对象执行新的在线压缩操作的建议。而且,这个 advisor 还给出关于段的历史增长趋势的报告,特别是能为容量规划提供有效的信息。 另一方面,Undo Advisor 则帮助管理员在调整 flashback 和非 flashback 中的表空间的大小时作出正确的判断。它为管理员适当地设置 UNDO_RETENTION 提供建议,以避免快照过于陈旧的问题。
DB2 9 引入了一些新的自治增强。例如,DB2 9 引入一种新的自调优内存特性(使用 self_tuning_mem 数据库配置参数),该特性自动地设置一些内存配置参数的值,从而简化了内存配置任务。自动调优器充当调度器的角色,它算出可用的内存资源,动态地将它们分 发给数据库的一些内存消费者。
除了自调优内存,DB2 9 还引入了下面提到的其他一些增强。这份列表并不完整,但是其中列出的都是重要的增强。
自动配置
DB2 8 引入了 Configuration Advisor,它可以检测系统和数据库的特征 —— CPU、内存、数据库大小、表的数量等,并为配置参数给出建议的值。DB2 9 则更进一步 —— 它在数据库创建之后自动运行 configuration advisor,并缺省地做出一些基本的调优决定。例如,它配置缺省缓冲池的大小、I/O 清理程序和 I/O 服务器等。 这种初始的自动调优意味着,同使用之前缺省的数据库配置参数值创建的数据库相比,现在的数据库将拥有更好的性能,并且有更好的即开即用性。
自动数据统计信息收集
缺省情况下,DB2 9 还允许对某些进行中的任务进行自动化。通过该特性,DB2 确定需要哪些统计信息,以及哪些统计信息需要更新,然后自动在后台执行 RUNSTATS 实用程序。
自动存储管理
DB2 9 扩展了在 DB2 V8.2.2 中首次引入的自动存储特性。自动存储自动增长跨磁盘和文件系统的数据库的大小,由于它是自动增长数据库大小的,因此 DBA 不需要管理存储容器。当在 DB2 9 中创建数据库时,自动存储管理特性是缺省地启用的。
自动表和索引重组增强
自动重组是从 8.2 版开始引入的。但是,DB9 对其加以增强,从而允许做以下事情:
指定具有适当页宽的系统临时表空间,用于离线表重组。
可限制被重组的表的大小。
指定自动索引重组应该在线运行,并且在在线维护窗口中运行。
指定在重组期间是保留还是重新构建压缩目录。
回页首
工具
我们来看看不同领域的一些工具,例如数据库创建和维护、网络、管理 GUI、性能调优、数据移动和备份恢复工具。图 15 显示了这些 DB2 9 GUI 工具。
图 15. DB2 9 GUI 工具
让我们看看类似的任务在 Oracle 和 DB2 9 中分别是怎样执行的。
数据库创建和维护
Oracle 提供了 Database Configuration Assistant(dbca)作为创建数据库的 GUI 工具。对于数据库维护,Oracle 提供了 Oracle Enterprise Manager。DB2 数据库则可以通过 DB2 Control Center 创建和维护。
网络
Oracle 提供了 Network Configuration Assistant(netca)来进行网络配置。或者,也可以使用 Oracle Network Manager 来配置服务名、侦听器、配置文件和 Oracle 名称服务器。DB2 则使用 CATALOG 命令来编目节点和数据库。此外还可以使用 DB2 命令行或 DB2 Configuration Assistant GUI 进行编目。
管理
Oracle Enterprise Manager 提供了针对管理员日常任务的广泛管理功能。DB2 Control Center 也提供了和 Oracle Enterprise Manager 类似的功能。除了 DB2 Control Center 外,还可以使用 DB2 命令行处理器来发出 DDL 和 DML 语句。该实用程序类似于 Oracle 的 SQLPLUS 实用程序。图 16 显示了 DB2 命令行处理器。
图 16. DB2 命令行处理器
还可以在 Command Center 中发出命令,如 图 17 所示。
图 17. Command Center GUI(DB2 命令行处理器的 GUI 版本)
性能调优
Oracle Enterprise Manager 附带有 Change Management Pack、Tuning Pack 和 Diagnostic Pack。DB2 则提供了 Event Analyzer、Health Center、Indoubt Transaction Manager 和 Memory Visualizer 作为性能调优任务的 GUI 工具。
数据移动
Oracle 提供了 SQL Loader(sqlldr)用于以定界文本格式装载数据。Import(imp)和 export(exp)可用于执行逻辑导入和导出。DB2 提供了类似的导入、导出和装载实用程序。对于跨平台的数据移动,DB2 提供了 db2move 实用程序。
备份和恢复
Oracle 提供了 Recovery Manager 作为热备份的选项。在 DB2 中,可以使用 backup 命令或 DB2 Control Center 备份数据库。
Oracle 10g Enteprise Manager 附带了新的性能概要表。增强的 Oracle Enterprise Manager HTML 界面为所有与数据库性能相关的统计信息提供了一个集中的访问点,为全面的监控和诊断提供了方便。
除了随 DB2 UDB version 8 发布的界面外,DB2 9 还引入了一种全新的免费应用程序开发工具,这个工具叫做 DB2 Developer Workbench(DWB),它是基于 Eclipse 框架的。这个工具可以单独下载,也可通过光盘获得,它替代了 DB2 8 的 Development Center。 DWB 是用于创建、编辑、调试、部署和测试 DB2 存储过程和用户定义函数的一站式中心。此外,还可以使用 DWB 来开发 SQLJ 应用程序,以及创建、编辑和运行 SQL 语句和 XML 查询。
DWB 有一些用于开发 DB2 业务对象的视图,例如:
Database Explorer 视图 —— 显示数据库中有什么对象(表、存储过程、用户定义函数、依赖关系、远程服务器等),并允许在这些对象上执行动作。
Data Project Explorer 视图 —— 在该视图中,可以通过简单的操作,例如拖放、复制粘贴、向导、上下文敏感的完成选项等,进行过程、用户定义函数和 SQL 语句的开发。
Data Output 视图 —— 在该视图中可以看到对数据库的数据开发的报告。
除了 DB2 8 的 Development Center 的功能外,新的 Developer Workbench 还包括对迁移报告、比较例程、XML 函数和使用 XQuery Builder 构建 XQuery 查询等等的支持。 现在可以从网站下载DB2 Developer Workbench 。
要了解关于 DB2 Developer Workbench 的更详细的信息,请阅读 developerWorks 中的这篇 教程。 要得到更详尽的示例和特性,请参考 developerWorks 中的文章 DB2 9 入门: 应用程序开发方面的增强。
图 18 展示了如何使用 DWB 创建存储过程:
图 18. DB2 Developer WorkBench
回页首
结束语
在 本文中,我们借助您当前已有的关于 Oracle 10g Release 2 的知识,对 DB2 9 for Linux, UNIX and Windows 进行了介绍。我们简要地描述了 DB2 9 架构、后台进程、内存模型、安全性、工具等方面。Oracle 与 DB2 9 之间有很多类似之处,我们也指出了它们之间的一些不同之处,以便您能借助已有的知识,在 DB2 9 中获得成功。
表 3 总结了我们讨论过的 Oracle 与 DB2 9 之间的相同点与不同点。
表 3 —— Oracle 与 DB2 9 概念总结
Oracle
DB2 9
注解
实例
实例
一个 DB2 实例可以包含多个数据库
数据库
数据库
initSID.ora 或 SPFILE
DBM CFG 和 DB CFG
DB2 使用两个级别的配置:Database Manager Configuration(DBM CFG)(实例级)和 Database Configuration(DB CFG)(数据库级)。与 Oracle 一样,很多配置参数可以动态更改
表空间
表空间
DB2 支持 SMS 和 DMS 这两类表空间。DMS 表空间与 Oracle 的表空间类似
数据块
页
DB2 支持以下几种页大小:4k、8k、16k 和 32k。一个行必须能够装入其中一种数据页内。它不能像在 Oracle 中那样跨多个页
盘区
盘区
数据文件
DMS 表空间容器
用于 DMS 表空间的容器可以是原始设备,也可以是文件
重做日志文件
事务日志文件
数据缓冲区
缓冲池
DB2 没有一组预定义的缓冲池,但是可以根据需要创建足够多的缓冲池。在创建具有给定页大小的表空间时,必须预先存在一个具有给定页宽的缓冲池
SGA
数据库管理器共享内存和数据库共享内存
数据字典
编目
库缓存
包缓存
大型池
实用程序堆
数据字典缓存
编目缓存
SYSTEM 表空间
SYSCATSPACE 表空间
你可能感兴趣的:(Database)
图数据库比较 Graph Database Comparison Chart
Babyfacer
Big Data
出处:http://objectivity.com/INFINITEGRAPH大图地址:http://objectivity.com/sites/default/files/infinite-graph-7_0.jpg
Hive全面解析精讲
绿萝蔓蔓绕枝生
hive 数据库 大数据 Hive精讲
目录一、Hive概述1、定义2、起源3、Hive的优势和特点4、Hive下载安装二、Hive的命令行模式1、Hive命令行模式2、Beenline命令行模式三、Hive的交互模式1、Hive元数据管理1、Hive交互模式2、Beeline交互模式3、交互模式操作四、Hive数据1、数据库(Database)2、数据表3、Hive数据类型4、Hive数据结构5、HQL五、Hive建表语句1、默认分隔
MySQL(1)
memorycx
mysql 数据库
数据库基础篇MYSQL概述SQL函数约束多表查询事务进阶篇存储索引索引SQL优化试图/存储过程/触发器锁InnoDB核心MySQL管理运维篇日志主从复制分库本表读写分离基础篇MySQL数据库概念:存储数据的仓库,数据是有组织的进行存储(DataBase,DB)数据库管理系统:操作和管理数据库的大型软件(DataManagementSystem,DBMS)SQL:操作关系型数据库的编程语言,定义了一
ArcGIS GeoDatabase ST_Geometry简介
三脚猫
ARCSDE oracle 存储 sql distance float constructor
ArcGISGeoDatabaseST_Geometry简介1使用ST_Geometry存储空间数据(oracle)1.1简介ArcSDEforOracle提供了ST_Geometry类型来存储几何数据。ST_Geometry是一种遵循ISO和OGC规范的,可以通过SQL直接读取的空间信息存储类型。采用这种存储方式能够更好的利用oracle的资源,更好的兼容oracle的特征,比如复制和分区,并且
Mybatis如何书写
黄袜子的小希
mybatis 数据库 java
kh下面我们开始书写mybatis①首先开始的时候创建数据库和表结构:createdatabasemybatis_demo;usemybatis_demo;CREATETABLE`user`(`id`int(11)NOTNULLauto_increment,`username`varchar(32)NOTNULLCOMMENT'用户名称',`birthday`datetimedefaultNULL
从建表语句带你学习doris_数据类型
圣·杰克船长
doris 数据类型
1、前言概述1.1、doris建表模板CREATE[EXTERNAL]TABLE[IFNOTEXISTS][DATABASE.]table_name(column_definition1[,column_deinition2,......][,index_definition1,[,index_definition2,]])[ENGINE=[olap|mysql|broker|hive]][key
【玩转全栈】----靓号管理系统实现
Edward-tan
oracle 数据库 django
先赞后看,养成习惯。。。目录数据库设置基本功能路由器靓号显示靓号添加靓号编辑视图函数额外功能搜索功能分页一般逻辑动态页码上下页首尾页数据库设置新建一个数据库(或者就用之前部门、用户管理的也行),用Django连接到数据库:DATABASES={"default":{"ENGINE":"django.db.backends.mysql","NAME":"mydata_1","USER":"root"
Flask-SQLAlchemy 根据数据库中已有的表建立Model对象
nico2333
Web
官方文档配置信息classConfig(object):"""配置参数"""#sqlalchemy的配置参数连接到数据库SQLALCHEMY_DATABASE_URI="[1数据库类型]://[2用户名]:[3密码]@[4数据库所在IP]:[5端口号]/[6数据库名]"#设置sqlalchemy自动跟踪数据库SQLALCHEMY_TRACK_MODIFICATIONS=Trueapp.config
Go语言web快速开发框架Gin如何进行数据的增删查改呢?
网友阿贵
Go语言 golang gin 后端 intellij-idea vscode
在Go语言中使用Gin框架进行Web开发时,你可以轻松地结合database/sql接口和具体的数据库驱动(如MySQL的go-sql-driver/mysql)来执行数据的增删查改(CRUD)操作。下面通过几个简单的例子展示如何使用Gin和MySQL进行基本的数据操作。1.安装依赖确保你已经安装了必要的依赖:goget-ugithub.com/gin-gonic/gingoget-ugithub
MySQL 基础学习(1):数据类型与操作数据库和数据表
Purified_Soda
MySQL数据库 oracle 数据库 mysql database
MySQL基础学习:数据类型与操作数据库和数据表在这篇博客中,我们将深入学习MySQL的基础操作,重点关注数据库和数据表的操作,以及MySQL中常见的数据类型。希望本文能帮助你更好地理解和掌握MySQL的基本用法。一、操作数据库在MySQL中,数据库是数据存储的逻辑集合,以下是常见的数据库操作:1.创建数据库createdatabase数据库名charsetutf8;通过以上命令,我们可以创建一个
如何设置AD域用户仅登录到指定的计算机?AD域管理软件
ad前端
一什么是AD域?简单理解:ActiveDirectory域内的directorydatabase(目录数据库)是被用来存储用户账户、计算机账户、打印机和共享文件夹等对象,而提供目录服务的组件就是ActiveDirectory(活动目录)域服务(ActiveDirectoryDomainService,ADDS),它负责目录数据库的存储、添加、删除、修改与查询等操作。一般适用于一个局域网内。在AD域
IndexedDB数据库应用
小纯洁w
IndexedDB
IndexedDB是一个在浏览器中持久化数据的大型、结构化存储系统。与LocalStorage相比,它允许存储更大量的结构化数据。同时,IndexedDB所有的操作都是异步的,这样在处理大量数据时,用户界面不会冻结。IndexedDB中添加新的数据//打开(或创建)数据库letopenRequest=indexedDB.open("myDatabase",1);openRequest.onupgr
MySQL基础知识
洛洛呀。
mysql 数据库
通用语法:1.语句可以单行或多行书写,以分号结尾2.MySQL数据库的SQL语句不区分大小写,关键字建议写大写3.注释:单行注释:--注释内容或#注释内容(MySQL特有)多行注释:/*注释内容*/DDL语法:1.查询SHOWDATABASES;2.创建CREATEDATABASE数据库名称;3.判断后创建数据库CREATEDATABASEIFNOTEXISTS数据库名称4.删除4.1删除数据库:
表的创建(列的类型定义)
Chasing追~
mysql数据库学习 数据库 c++ 学习 mysql
数据表操作表是一种很重要的数据库对象,是组成数据库的基本元素,由若干个字段组成,主要用来实现存储数据记录。表的操作包括创建表、查询表、修改表和删除表。如何创建一张简单表?ID(class_id)名称(class_name)班主任(class_teacher)101六年级一班马老师102六年级二班潘老师createdatabaseschool;useschool;createtableclass(c
PostgreSQL 介绍
candy662
postgresql
PostgreSQL是一个免费的对象-关系数据库服务器(ORDBMS),在灵活的BSD许可证下发行。PostgreSQL开发者把它念作post-gress-Q-L。PostgreSQL的Slogan是"世界上最先进的开源关系型数据库"。参考内容:PostgreSQL10.1手册什么是数据库?数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。每个数据库都有一个或多个不同的API用
MySQL命令及用法(精华版)
MegumiKato丶
知识杂谈 mysql 数据库
目录DDL(数据定义语言)数据库操作表操作DML(数据操作语言)DQL(数据查询语言)基本查询条件查询聚合函数分组查询排序查询分页查询DCL(数据控制语言)用户管理权限控制函数字符串函数数值函数日期函数流程函数约束多表查询内连接外连接自连接联合查询子查询标量子查询列子查询行子查询表子查询事务DDL(数据定义语言)用来定义数据库、表、字段。数据库操作查询所有数据库SHOWDATABASES;查询当前
hive窗口函数和hive基础使用
醉与浮
hive hive 大数据 hadoop
7.270.连接客户端beeline-ujdbc:hive2://localhost:100001.建库并使用createdatabasexxxusexxx2.建表createtablexxxcreateexternaltableifnotexists如果该外部表不存在则创建外部表被删除时只会删除元数据不会删除数据。(hive不认为自己拥有这份数据)3.导入数据loaddatainpath‘/ro
Error querying database. Cause: java.lang.IllegalArgumentException: Mapped Statements collection do
leaftong
java 数据库 mybatis
项目场景:背景:在练习mybatis的对象映射时,设置了一个嵌套查询
java设计模式-创建型模式-建造者模式
shuair
java设计模式 java 设计模式 建造者模式
java设计模式-创建型模式-建造者模式场景举例根据表名、每页条数、偏移量等属性进行拼接组装,并且根据不同的数据库类型生成不同的sql脚本观察Lombok@Builder注解生成的代码源码packagexin.yangshuai.basic01.gof23.builder;importlombok.Builder;@BuilderpublicclassDatabaseSqlLombok{/***数
SQLI靶场(四)(54~65关)
新玉5401
数据库 oracle java
less-54本关需要我们在10步之内获取到字段名。不过方法和之前还是一样。但是本关会随机生成数据库名字,表名,列名。以下语句是根据我在通关时所随机产生的内容而定的。判断闭合输入:?id=1,?id=1'据此得出闭合方式为单引号闭合。判断显示位输入:?id=-1'unionselect1,2,3--+获取数据库名输入:?id=-1'unionselect1,database(),3--+获取表名输
数据库基础知识:理论、E-R图、事务、原则
地信小学生
数据库 数据库 ubuntu postgresql
(5)数据库理论与E-R图数据库理论(DatabaseTheory)是在创建数据库的过程涉及创建现实世界的抽象模型;将现实世界的概念作为实体表示在数据库中。E-R图(EntityRelationshipDiagramming)用于表示数据模型的图形工具/关系的抽象,主要用于数据库设计阶段,通过实体(Entity)、属性(Attribute)和关系(Relationship)来描述数据之间的结构和联
详解数据库系统概述
凭君语未可
数据库 数据库 oracle
数据库系统概述1.数据库(Database)1.1定义:1.2特点:1.3举例:2.数据库管理系统(DBMS:DatabaseManagementSystem)2.1定义:2.2DBMS的主要功能:2.3常见的数据库管理系统:2.4工作流程(类比):3.数据库系统(DatabaseSystem)3.1定义:3.2组成:3.3举例:三者的关系举例:以电商系统为例总结(《数据库系统概论》)数据库数据库
redis原理
小哲会嘿魔法
redis 数据库 缓存
文章目录redis客户端-认识RESP持久化持久化具体实现1.RDB(RedisDataBase)2.AOF(AppendOnlyFile)事务相关命令主从复制拓扑结构同步过程部分复制实时复制哨兵(Sentinel)哨兵选取主节点流程集群数据分片主节点宕机集群扩容缓存缓存更新缓存预热、缓存穿透、缓存雪崩、缓存击穿分布式锁过期时间校验IdLua脚本watchdog(看门狗)Redlock算法redi
java.sql.date 字符串,字符串到java.sql.Date
高度不可替代性
java.sql.date 字符串
Irealizethishasbeenaskedalot.Ididactuallylook.I'vespenthourslookingaroundandtryingtofigurethisout.I'msupposedtobemakingaprogramthatstoreswhatamountstoalistofappointmentsinadatabase,withadescription,da
【Redis】Redis入门以及什么是分布式系统{Redis引入+分布式系统介绍}
阿猿收手吧!
# Redis redis 数据库 缓存
文章目录介绍redis的引入分布式系统单机架构应用服务和数据库服务分离【负载均衡】引入更多的应用服务器节点单机架构分布式是什么数据库分离和负载均衡理解负载均衡数据库读写分离引入缓存数据库分库分表引入微服务介绍Theopensource,in-memorydatastoreusedbymillionsofdevelopersasadatabases,cache,streamingengine,and
【MYSQL】mysql 常用命令
roman_日积跬步-终至千里
常用命令 mysql 数据库
文章目录1.数据库管理命令2.表管理命令3.数据操作命令4.数据查询进阶5.用户与权限管理6.使用脚本操作数据库1.数据库管理命令--查看所有数据库SHOWDATABASES;--创建数据库CREATEDATABASE数据库名;--选择数据库USE数据库名;--删除数据库DROPDATABASE数据库名;2.表管理命令--查看所有表SHOWTABLES;--查看表结构DESCRIBE表名;--或S
Kotlin | Android Provider 的实现案例
Dic-
# Android APP Kotlin 自学笔记 Android Kotlin 数据库 Provider
目标使用AndroidRoom实现持久化库。代码Kotlin代码编写DemoDatabase,在build生成DemoDatabase_Impl疑问Provider的数据会存在设备吗?内部存储:当使用Room创建数据库(如DemoDatabase),数据库文件通常会存储在data/data//databases/目录下。例如,如果包名是com.example.yourapp,则数据库文件将存储在d
【neo4j】neo4j和Cypher 查询语言相关知识点
杰九
neo4j
【neo4j】neo4j和Cypher查询语言相关知识点1.什么是neo4jNeo4j是一个广泛使用的图形数据库管理系统(GraphDatabaseManagementSystem)。它是一种NoSQL数据库,专为存储和查询图形数据而设计。Neo4j支持图形数据模型,允许用户以节点(Nodes)和关系(Relationships)的形式存储数据,并通过属性(Properties)来丰富这些节点和关
Oracle 创建DBLink方法
夜光小兔纸
数据库 Oracle oracle
一、创建新的DBLink需求说明:现有两个测试库,现想通过DBLink在测试库1连接测试库2。创建DBLink1)在测试库查看是否拥有创建DBLink的权限select*fromuser_sys_privswhereprivilegelikeupper('%DATABASELINK%');查询无结果输出,说明当前用户没有创建DBLink的权限。2)赋权当前用户创建DBLink的权限$sqlplus
Oracle 普通用户连接hang住处理方法
夜光小兔纸
数据库 Oracle 运维 oracle 数据库 运维
一、现象说明$sqlplus/assysdbaSQL*Plus:Release19.0.0.0.0-ProductiononWedDec1816:49:192024Version19.11.0.0.0Copyright(c)1982,2020,Oracle.Allrightsreserved.Connectedto:OracleDatabase19cEnterpriseEditionRelease
二分查找排序算法
周凡杨
java 二分查找 排序 算法 折半
一:概念 二分查找又称
折半查找(
折半搜索/
二分搜索),优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而 查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表 分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步
java中的BigDecimal
bijian1013
java BigDecimal
在项目开发过程中出现精度丢失问题,查资料用BigDecimal解决,并发现如下这篇BigDecimal的解决问题的思路和方法很值得学习,特转载。
原文地址:http://blog.csdn.net/ugg/article/de
Shell echo命令详解
daizj
echo shell
Shell echo命令
Shell 的 echo 指令与 PHP 的 echo 指令类似,都是用于字符串的输出。命令格式:
echo string
您可以使用echo实现更复杂的输出格式控制。 1.显示普通字符串:
echo "It is a test"
这里的双引号完全可以省略,以下命令与上面实例效果一致:
echo Itis a test 2.显示转义
Oracle DBA 简单操作
周凡杨
oracle dba sql
--执行次数多的SQL
select sql_text,executions from (
select sql_text,executions from v$sqlarea order by executions desc
) where rownum<81;
&nb
画图重绘
朱辉辉33
游戏
我第一次接触重绘是编写五子棋小游戏的时候,因为游戏里的棋盘是用线绘制的,而这些东西并不在系统自带的重绘里,所以在移动窗体时,棋盘并不会重绘出来。所以我们要重写系统的重绘方法。
在重写系统重绘方法时,我们要注意一定要调用父类的重绘方法,即加上super.paint(g),因为如果不调用父类的重绘方式,重写后会把父类的重绘覆盖掉,而父类的重绘方法是绘制画布,这样就导致我们
线程之初体验
西蜀石兰
线程
一直觉得多线程是学Java的一个分水岭,懂多线程才算入门。
之前看《编程思想》的多线程章节,看的云里雾里,知道线程类有哪几个方法,却依旧不知道线程到底是什么?书上都写线程是进程的模块,共享线程的资源,可是这跟多线程编程有毛线的关系,呜呜。。。
线程其实也是用户自定义的任务,不要过多的强调线程的属性,而忽略了线程最基本的属性。
你可以在线程类的run()方法中定义自己的任务,就跟正常的Ja
linux集群互相免登陆配置
林鹤霄
linux
配置ssh免登陆
1、生成秘钥和公钥 ssh-keygen -t rsa
2、提示让你输入,什么都不输,三次回车之后会在~下面的.ssh文件夹中多出两个文件id_rsa 和 id_rsa.pub
其中id_rsa为秘钥,id_rsa.pub为公钥,使用公钥加密的数据只有私钥才能对这些数据解密 c
mysql : Lock wait timeout exceeded; try restarting transaction
aigo
mysql
原文:http://www.cnblogs.com/freeliver54/archive/2010/09/30/1839042.html
原因是你使用的InnoDB 表类型的时候,
默认参数:innodb_lock_wait_timeout设置锁等待的时间是50s,
因为有的锁等待超过了这个时间,所以抱错.
你可以把这个时间加长,或者优化存储
Socket编程 基本的聊天实现。
alleni123
socket
public class Server
{
//用来存储所有连接上来的客户
private List<ServerThread> clients;
public static void main(String[] args)
{
Server s = new Server();
s.startServer(9988);
}
publi
多线程监听器事件模式(一个简单的例子)
百合不是茶
线程 监听模式
多线程的事件监听器模式
监听器时间模式经常与多线程使用,在多线程中如何知道我的线程正在执行那什么内容,可以通过时间监听器模式得到
创建多线程的事件监听器模式 思路:
1, 创建线程并启动,在创建线程的位置设置一个标记
2,创建队
spring InitializingBean接口
bijian1013
java spring
spring的事务的TransactionTemplate,其源码如下:
public class TransactionTemplate extends DefaultTransactionDefinition implements TransactionOperations, InitializingBean{
...
}
TransactionTemplate继承了DefaultT
Oracle中询表的权限被授予给了哪些用户
bijian1013
oracle 数据库 权限
Oracle查询表将权限赋给了哪些用户的SQL,以备查用。
select t.table_name as "表名",
t.grantee as "被授权的属组",
t.owner as "对象所在的属组"
【Struts2五】Struts2 参数传值
bit1129
struts2
Struts2中参数传值的3种情况
1.请求参数绑定到Action的实例字段上
2.Action将值传递到转发的视图上
3.Action将值传递到重定向的视图上
一、请求参数绑定到Action的实例字段上以及Action将值传递到转发的视图上
Struts可以自动将请求URL中的请求参数或者表单提交的参数绑定到Action定义的实例字段上,绑定的规则使用ognl表达式语言
【Kafka十四】关于auto.offset.reset[Q/A]
bit1129
kafka
I got serveral questions about auto.offset.reset. This configuration parameter governs how consumer read the message from Kafka when there is no initial offset in ZooKeeper or
nginx gzip压缩配置
ronin47
nginx gzip 压缩范例
nginx gzip压缩配置 更多
0
nginx
gzip
配置
随着nginx的发展,越来越多的网站使用nginx,因此nginx的优化变得越来越重要,今天我们来看看nginx的gzip压缩到底是怎么压缩的呢?
gzip(GNU-ZIP)是一种压缩技术。经过gzip压缩后页面大小可以变为原来的30%甚至更小,这样,用
java-13.输入一个单向链表,输出该链表中倒数第 k 个节点
bylijinnan
java
two cursors.
Make the first cursor go K steps first.
/*
* 第 13 题:题目:输入一个单向链表,输出该链表中倒数第 k 个节点
*/
public void displayKthItemsBackWard(ListNode head,int k){
ListNode p1=head,p2=head;
Spring源码学习-JdbcTemplate queryForObject
bylijinnan
java spring
JdbcTemplate中有两个可能会混淆的queryForObject方法:
1.
Object queryForObject(String sql, Object[] args, Class requiredType)
2.
Object queryForObject(String sql, Object[] args, RowMapper rowMapper)
第1个方法是只查
[冰川时代]在冰川时代,我们需要什么样的技术?
comsci
技术
看美国那边的气候情况....我有个感觉...是不是要进入小冰期了?
那么在小冰期里面...我们的户外活动肯定会出现很多问题...在室内呆着的情况会非常多...怎么在室内呆着而不发闷...怎么用最低的电力保证室内的温度.....这都需要技术手段...
&nb
js 获取浏览器型号
cuityang
js 浏览器
根据浏览器获取iphone和apk的下载地址
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" content="text/html"/>
<meta name=
C# socks5详解 转
dalan_123
socket C#
http://www.cnblogs.com/zhujiechang/archive/2008/10/21/1316308.html 这里主要讲的是用.NET实现基于Socket5下面的代理协议进行客户端的通讯,Socket4的实现是类似的,注意的事,这里不是讲用C#实现一个代理服务器,因为实现一个代理服务器需要实现很多协议,头大,而且现在市面上有很多现成的代理服务器用,性能又好,
运维 Centos问题汇总
dcj3sjt126com
云主机
一、sh 脚本不执行的原因
sh脚本不执行的原因 只有2个
1.权限不够
2.sh脚本里路径没写完整。
二、解决You have new mail in /var/spool/mail/root
修改/usr/share/logwatch/default.conf/logwatch.conf配置文件
MailTo =
MailFrom
三、查询连接数
Yii防注入攻击笔记
dcj3sjt126com
sql WEB安全 yii
网站表单有注入漏洞须对所有用户输入的内容进行个过滤和检查,可以使用正则表达式或者直接输入字符判断,大部分是只允许输入字母和数字的,其它字符度不允许;对于内容复杂表单的内容,应该对html和script的符号进行转义替换:尤其是<,>,',"",&这几个符号 这里有个转义对照表:
http://blog.csdn.net/xinzhu1990/articl
MongoDB简介[一]
eksliang
mongodb MongoDB简介
MongoDB简介
转载请出自出处:http://eksliang.iteye.com/blog/2173288 1.1易于使用
MongoDB是一个面向文档的数据库,而不是关系型数据库。与关系型数据库相比,面向文档的数据库不再有行的概念,取而代之的是更为灵活的“文档”模型。
另外,不
zookeeper windows 入门安装和测试
greemranqq
zookeeper 安装 分布式
一、序言
以下是我对zookeeper 的一些理解: zookeeper 作为一个服务注册信息存储的管理工具,好吧,这样说得很抽象,我们举个“栗子”。
栗子1号:
假设我是一家KTV的老板,我同时拥有5家KTV,我肯定得时刻监视
Spring之使用事务缘由(2-注解实现)
ihuning
spring
Spring事务注解实现
1. 依赖包:
1.1 spring包:
spring-beans-4.0.0.RELEASE.jar
spring-context-4.0.0.
iOS App Launch Option
啸笑天
option
iOS 程序启动时总会调用application:didFinishLaunchingWithOptions:,其中第二个参数launchOptions为NSDictionary类型的对象,里面存储有此程序启动的原因。
launchOptions中的可能键值见UIApplication Class Reference的Launch Options Keys节 。
1、若用户直接
jdk与jre的区别(_)
macroli
java jvm jdk
简单的说JDK是面向开发人员使用的SDK,它提供了Java的开发环境和运行环境。SDK是Software Development Kit 一般指软件开发包,可以包括函数库、编译程序等。
JDK就是Java Development Kit JRE是Java Runtime Enviroment是指Java的运行环境,是面向Java程序的使用者,而不是开发者。 如果安装了JDK,会发同你
Updates were rejected because the tip of your current branch is behind
qiaolevip
学习永无止境 每天进步一点点 众观千象 git
$ git push joe prod-2295-1
To
[email protected] :joe.le/dr-frontend.git
! [rejected] prod-2295-1 -> prod-2295-1 (non-fast-forward)
error: failed to push some refs to '
[email protected]
[一起学Hive]之十四-Hive的元数据表结构详解
superlxw1234
hive hive元数据结构
关键字:Hive元数据、Hive元数据表结构
之前在 “[一起学Hive]之一–Hive概述,Hive是什么”中介绍过,Hive自己维护了一套元数据,用户通过HQL查询时候,Hive首先需要结合元数据,将HQL翻译成MapReduce去执行。
本文介绍一下Hive元数据中重要的一些表结构及用途,以Hive0.13为例。
文章最后面,会以一个示例来全面了解一下,
Spring 3.2.14,4.1.7,4.2.RC2发布
wiselyman
Spring 3
Spring 3.2.14、4.1.7及4.2.RC2于6月30日发布。
其中Spring 3.2.1是一个维护版本(维护周期到2016-12-31截止),后续会继续根据需求和bug发布维护版本。此时,Spring官方强烈建议升级Spring框架至4.1.7 或者将要发布的4.2 。
其中Spring 4.1.7主要包含这些更新内容。