
数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列 *** 作,要么完全地执行,要么完全地不执行。
原子性(Atomic)(Atomicity) 事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。通常,与某个事务关联的 *** 作具有共同的目标,并且是相互依赖的。如果系统只执行这些 *** 作的一个子集,则可能会破坏事务的总体目标。原子性消除了系统处理 *** 作子集的可能性。
一致性(Consistent)(Consistency) 事务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。事务结束时,所有的内部数据结构(如 B 树索引或双向链表)都必须是正确的。某些维护一致性的责任由应用程序开发人员承担,他们必须确保应用程序已强制所有已知的完整性约束。如,当开发用于转账的应用程序时,应避免在转账过程中任意移动小数点。
隔离性(Insulation)(Isolation) 由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。这称为隔离性,因为它能够重新装载起始数据,并且重播一系列事务,以使数据结束时的状态与原始事务执行的状态相同。当事务可序列化时将获得最高的隔离级别。在此级别上,从一组可并行执行的事务获得的结果与通过连续运行每个事务所获得的结果相同。由于高度隔离会限制可并行执行的事务数,所以一些应用程序降低隔离级别以换取更大的吞吐量。
持久性(Duration)(Durability) 事务完成之后,它对于系统的影响是永久性的。该修改即使出现致命的系统故障也将一直保持。
关系型数据库,是指采用了关系模型来组织数据的数据库,其以行和列的形式存储数据,以便于用户理解,关系型数据库这一系列的行和列被称为表,一组表组成了数据库。
用户通过查询来检索数据库中的数据,而查询是一个用于限定数据库中某些区域的执行代码。
关系模型可以简单理解为二维表格模型,而一个关系型数据库就是由二维表及其之间的关系组成的一个数据组织。
扩展资料:
关系型数据库特点:
1、存储方式:传统的关系型数据库采用表格的储存方式,数据以行和列的方式进行存储,要读取和查询都十分方便。
2、存储结构:关系型数据库按照结构化的方法存储数据,每个数据表都必须对各个字段定义好,再根据表的结构存入数据,这样做的好处就是由于数据的形式和内容在存入数据之前就已经定义好了,所以整个数据表的可靠性和稳定性都比较高。
3、存储规范:关系型数据库为了避免重复、规范化数据以及充分利用好存储空间,把数据按照最小关系表的形式进行存储,这样数据管理的就可以变得很清晰、一目了然,当然这主要是一张数据表的情况。
4、扩展方式:由于关系型数据库将数据存储在数据表中,数据 *** 作的瓶颈出现在多张数据表的 *** 作中,而且数据表越多这个问题越严重,如果要缓解这个问题,只能提高处理能力,也就是选择速度更快性能更高的计算机。
5、查询方式:关系型数据库采用结构化查询语言来对数据库进行查询,SQL早已获得了各个数据库厂商的支持,成为数据库行业的标准,它能够支持数据库的CRUD *** 作,具有非常强大的功能,SQL可以采用类似索引的方法来加快查询 *** 作。
6、规范化:在数据库的设计开发过程中开发人员通常会面对同时需要对一个或者多个数据实体进行 *** 作,这样在关系型数据库中,一个数据实体一般首先要分割成多个部分,然后再对分割的部分进行规范化,规范化以后再分别存入到多张关系型数据表中,这是一个复杂的过程。
7、事务性:关系型数据库强调ACID规则(原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)),可以满足对事务性要求较高或者需要进行复杂数据查询的数据 *** 作,而且可以充分满足数据库 *** 作的高性能和 *** 作稳定性的要求。
8、读写性能:关系型数据库十分强调数据的一致性,并为此降低读写性能付出了巨大的代价,虽然关系型数据库存储数据和处理数据的可靠性很不错,但一旦面对海量数据的处理的时候效率就会变得很差,特别是遇到高并发读写的时候性能就会下降的非常厉害。
9、授权方式:关系型数据库常见的有 Oracle,SQLServer,DB2,Mysql,除了Mysql大多数的关系型数据库如果要使用都需要支付一笔价格高昂的费用,即使是免费的Mysql性能也受到了诸多的限制。
Java语言规范中指出 为了获得最佳速度 允许线程保存共享成员变量的私有拷贝 而且只当线程进入或者离开同步代码块时才与共享成员变量的原始值对比
这样当多个线程同时与某个对象交互时 就必须要注意到要让线程及时的得到共享成员变量的变化
而volatile关键字就是提示VM:对于这个成员变量不能保存它的私有拷贝 而应直接与共享成员变量交互
使用建议 在两个或者更多的线程访问的成员变量上使用volatile 当要访问的变量已在synchronized代码块中 或者为常量时 不必使用
由于使用volatile屏蔽掉了VM中必要的代码优化 所以在效率上比较低 因此一定在必要时才使用此关键字
Java的serialization提供了一种持久化对象实例的机制 当持久化对象时 可能有一个特殊的对象数据成员 我们不想用serialization机制来保存它 为了在一个特定对象的一个域上关闭serialization 可以在这个域前加上关键字transient
transient是Java语言的关键字 用来表示一个域不是该对象串行化的一部分 当一个对象被串行化的时候 transient型变量的值不包括在串行化的表示中 然而非transient型的变量是被包括进去的
注意static变量也是可以串行化的
Java 语言中的 volatile 变量可以被看作是一种 程度较轻的 synchronized ;与 synchronized 块相比 volatile 变量所需的编码较少 并且运行时开销也较少 但是它所能实现的功能也仅是 synchronized 的一部分 本文介绍了几种有效使用 volatile 变量的模式 并强调了几种不适合使用 volatile 变量的情形
锁提供了两种主要特性 互斥(mutual exclusion) 和可见性(visibility) 互斥即一次只允许一个线程持有某个特定的锁 因此可使用该特性实现对共享数据的协调访问协议 这样 一次就只有一个线程能够使用该共享数据 可见性要更加复杂一些 它必须确保释放锁之前对共享数据做出的更改对于随后获得该锁的另一个线程是可见的 如果没有同步机制提供的这种可见性保证 线程看到的共享变量可能是修改前的值或不一致的值 这将引发许多严重问题
Volatile 变量
Volatile 变量具有 synchronized 的可见性特性 但是不具备原子特性 这就是说线程能够自动发现 volatile 变量的最新值 Volatile 变量可用于提供线程安全 但是只能应用于非常有限的一组用例 多个变量之间或者某个变量的当前值与修改后值之间没有约束 因此 单独使用 volatile 还不足以实现计数器 互斥锁或任何具有与多个变量相关的不变式(Invariants)的类(例如 start <=end )
出于简易性或可伸缩性的考虑 您可能倾向于使用 volatile 变量而不是锁 当使用 volatile 变量而非锁时 某些习惯用法(idiom)更加易于编码和阅读 此外 volatile 变量不会像锁那样造成线程阻塞 因此也很少造成可伸缩性问题 在某些情况下 如果读 *** 作远远大于写 *** 作 volatile 变量还可以提供优于锁的性能优势
正确使用 volatile 变量的条件
您只能在有限的一些情形下使用 volatile 变量替代锁 要使 volatile 变量提供理想的线程安全 必须同时满足下面两个条件
对变量的写 *** 作不依赖于当前值
该变量没有包含在具有其他变量的不变式中
实际上 这些条件表明 可以被写入 volatile 变量的这些有效值独立于任何程序的状态 包括变量的当前状态
第一个条件的限制使 volatile 变量不能用作线程安全计数器 虽然增量 *** 作(x++)看上去类似一个单独 *** 作 实际上它是一个由读取 修改 写入 *** 作序列组成的组合 *** 作 必须以原子方式执行 而 volatile 不能提供必须的原子特性 实现正确的 *** 作需要使 x 的值在 *** 作期间保持不变 而 volatile 变量无法实现这点 (然而 如果将值调整为只从单个线程写入 那么可以忽略第一个条件 )
大多数编程情形都会与这两个条件的其中之一冲突 使得 volatile 变量不能像 synchronized 那样普遍适用于实现线程安全 清单 显示了一个非线程安全的数值范围类 它包含了一个不变式 下界总是小于或等于上界
清单 非线程安全的数值范围类
@NotThreadSafe
public class NumberRange {
private int lower upper;
public int getLower() { return lower; }
public int getUpper() { return upper; }
public void setLower(int value) {
if (value > upper)
throw new IllegalArgumentException(…)
lower = value;
}
public void setUpper(int value) {
if (value < lower)
throw new IllegalArgumentException(…)
upper = value;
}
}
这种方式限制了范围的状态变量 因此将 lower 和 upper 字段定义为 volatile 类型不能够充分实现类的线程安全 从而仍然需要使用同步 否则 如果凑巧两个线程在同一时间使用不一致的值执行 setLower 和 setUpper 的话 则会使范围处于不一致的状态 例如 如果初始状态是 ( ) 同一时间内 线程 A 调用 setLower( ) 并且线程 B 调用 setUpper( ) 显然这两个 *** 作交叉存入的值是不符合条件的 那么两个线程都会通过用于保护不变式的检查 使得最后的范围值是 ( ) 一个无效值 至于针对范围的其他 *** 作 我们需要使 setLower() 和 setUpper() *** 作原子化 而将字段定义为 volatile 类型是无法实现这一目的的
性能考虑
使用 volatile 变量的主要原因是其简易性 在某些情形下 使用 volatile 变量要比使用相应的锁简单得多 使用 volatile 变量次要原因是其性能 某些情况下 volatile 变量同步机制的性能要优于锁
很难做出准确 全面的评价 例如 X 总是比 Y 快 尤其是对 JVM 内在的 *** 作而言 (例如 某些情况下 VM 也许能够完全删除锁机制 这使得我们难以抽象地比较 volatile和 synchronized 的开销 )就是说 在目前大多数的处理器架构上 volatile 读 *** 作开销非常低 几乎和非 volatile 读 *** 作一样 而 volatile 写 *** 作的开销要比非 volatile 写 *** 作多很多 因为要保证可见性需要实现内存界定(Memory Fence) 即便如此 volatile 的总开销仍然要比锁获取低
volatile *** 作不会像锁一样造成阻塞 因此 在能够安全使用 volatile 的情况下 volatile 可以提供一些优于锁的可伸缩特性 如果读 *** 作的次数要远远超过写 *** 作 与锁相比 volatile 变量通常能够减少同步的性能开销
正确使用 volatile 的模式
很多并发性专家事实上往往引导用户远离 volatile 变量 因为使用它们要比使用锁更加容易出错 然而 如果谨慎地遵循一些良好定义的模式 就能够在很多场合内安全地使用 volatile 变量 要始终牢记使用 volatile 的限制 只有在状态真正独立于程序内其他内容时才能使用 volatile 这条规则能够避免将这些模式扩展到不安全的用例
模式 # :状态标志
也许实现 volatile 变量的规范使用仅仅是使用一个布尔状态标志 用于指示发生了一个重要的一次性事件 例如完成初始化或请求停机
很多应用程序包含了一种控制结构 形式为 在还没有准备好停止程序时再执行一些工作 如清单 所示
清单 将 volatile 变量作为状态标志使用
volatile boolean shutdownRequested;
…
public void shutdown() { shutdownRequested = true; }
public void doWork() {
while (!shutdownRequested) {
// do stuff
}
}
很可能会从循环外部调用 shutdown() 方法 即在另一个线程中 因此 需要执行某种同步来确保正确实现 shutdownRequested 变量的可见性 (可能会从 JMX 侦听程序 GUI 事件线程中的 *** 作侦听程序 通过 RMI 通过一个 Web 服务等调用) 然而 使用 synchronized 块编写循环要比使用清单 所示的 volatile 状态标志编写麻烦很多 由于 volatile 简化了编码 并且状态标志并不依赖于程序内任何其他状态 因此此处非常适合使用 volatile
这种类型的状态标记的一个公共特性是 通常只有一种状态转换 shutdownRequested 标志从 false 转换为 true 然后程序停止 这种模式可以扩展到来回转换的状态标志 但是只有在转换周期不被察觉的情况下才能扩展(从 false 到 true 再转换到 false) 此外 还需要某些原子状态转换机制 例如原子变量
模式 # :一次性安全发布(one time safe publication)
缺乏同步会导致无法实现可见性 这使得确定何时写入对象引用而不是原语值变得更加困难 在缺乏同步的情况下 可能会遇到某个对象引用的更新值(由另一个线程写入)和该对象状态的旧值同时存在 (这就是造成著名的双重检查锁定(double checked locking)问题的根源 其中对象引用在没有同步的情况下进行读 *** 作 产生的问题是您可能会看到一个更新的引用 但是仍然会通过该引用看到不完全构造的对象)
实现安全发布对象的一种技术就是将对象引用定义为 volatile 类型 清单 展示了一个示例 其中后台线程在启动阶段从数据库加载一些数据 其他代码在能够利用这些数据时 在使用之前将检查这些数据是否曾经发布过
清单 将 volatile 变量用于一次性安全发布
public class BackgroundFloobleLoader {
public volatile Flooble theFlooble;
public void initInBackground() {
// do lots of stuff
theFlooble = new Flooble() // this is the only write to theFlooble
}
}
public class SomeOtherClass {
public void doWork() {
while (true) {
// do some stuff…
// use the Flooble but only if it is ready
if (floobleLoader theFlooble != null)
doSomething(floobleLoader theFlooble)
}
}
}
如果 theFlooble 引用不是 volatile 类型 doWork() 中的代码在解除对 theFlooble 的引用时 将会得到一个不完全构造的 Flooble
该模式的一个必要条件是 被发布的对象必须是线程安全的 或者是有效的不可变对象(有效不可变意味着对象的状态在发布之后永远不会被修改) volatile 类型的引用可以确保对象的发布形式的可见性 但是如果对象的状态在发布后将发生更改 那么就需要额外的同步
模式 # :独立观察(independent observation)
安全使用 volatile 的另一种简单模式是 定期 发布 观察结果供程序内部使用 例如 假设有一种环境传感器能够感觉环境温度 一个后台线程可能会每隔几秒读取一次该传感器 并更新包含当前文档的 volatile 变量 然后 其他线程可以读取这个变量 从而随时能够看到最新的温度值
使用该模式的另一种应用程序就是收集程序的统计信息 清单 展示了身份验证机制如何记忆最近一次登录的用户的名字 将反复使用 lastUser 引用来发布值 以供程序的其他部分使用
清单 将 volatile 变量用于多个独立观察结果的发布
public class UserManager {
public volatile String lastUser;
public boolean authenticate(String user String password) {
boolean valid = passwordIsValid(user password)
if (valid) {
User u = new User()
activeUsers add(u)
lastUser = user;
}
return valid;
}
}
该模式是前面模式的扩展 将某个值发布以在程序内的其他地方使用 但是与一次性事件的发布不同 这是一系列独立事件 这个模式要求被发布的值是有效不可变的 即值的状态在发布后不会更改 使用该值的代码需要清楚该值可能随时发生变化
模式 # : volatile bean 模式
volatile bean 模式适用于将 JavaBeans 作为 荣誉结构 使用的框架 在 volatile bean 模式中 JavaBean 被用作一组具有 getter 和/或 setter 方法 的独立属性的容器 volatile bean 模式的基本原理是 很多框架为易变数据的持有者(例如 >
数据库应用系统的开发是一项软件工程。一般可分为以下几个阶段:
1规划 2需求分析 3概念模型设计 4 逻辑设计5物理设计 6程序编制及调试 7运行及维护。 这些阶段的划分目前尚无统一的标准,各阶段间相互联接,而且常常需要回溯修正。 在数据库应用系统的开发过程中,每个阶段的工作成果就是写出相应的文档。每个阶段都是在上一阶段工作成果的基础上继续进行,整个开发工程是有依据、有组织、有计划、有条不紊地展开工作。
1规划规划的主要任务就是作必要性及可行性分析。 在收集整理有关资料的基础上,要确定将建立的数据库应用系统与周边的关系,要对应用系统定位,其规模的大小、所处的地位、应起的作用均须作全面的分析和论证。 明确应用系统的基本功能,划分数据库支持的范围。分析数据来源、数据采集的方式和范围,研究数据结构的特点,估算数据量的大小,确立数据处理的基本要求和业务的规范标准。 规划人力资源调配。对参与研制和以后维护系统运作的管理人员、技术人员的技术业务水平提出要求,对最终用户、 *** 作员的素质作出评估。 拟定设备配置方案。论证计算机、网络和其他设备在时间、空间两方面的处理能力,要有足够的内外存容量,系统的响应速度、网络传输和输入输出能力应满足应用需求并留有余量。要选择合适的os,dbms和其它软件。设备配置方案要在使用要求、系统性能、购置成本和维护代价各方面综合权衡。 对系统的开发、运行、维护的成本作出估算。预测系统效益的期望值。 拟定开发进度计划,还要对现行工作模式如何向新系统过渡作出具体安排。 规划阶段的工作成果是写出详尽的可行性分析报告和数据库应用系统规划书。内容应包括:系统的定位及其功能、数据资源及数据处理能力、人力资源调配、设备配置方案、开发成本估算、开发进度计划等。 可行性分析报告和数据库应用系统规划书经审定立项后,成为后续开发工作的总纲。 2需求分析需求分析大致可分成三步来完成。 (1) 需求信息的收集, 需求信息的收集一般以机构设置和业务活动为主干线,从高层中层到低层逐步展开 (2) 需求信息的分析整理, 对收集到的信息要做分析整理工作。数据流图(dfd, data flow diagram)是业务流程及业务中数据联系的形式描述。图41是一个简单的dfd 示例。 数据字典(dd, data dictionary)详细描述系统中的全部数据。 数据字典包含以下几个部分。 数据项:是数据的原子单位。 数据组项:由若干数据项组成。 数据流:表示某一数据加工过程的输入/输出数据。 数据存储:是处理过程中要存取的数据。 数据加工过程 数据加工过程的描述包括:数据加工过程名、说明、输入、输出、加工处理工作摘要、加工处理频度、加工处理的数据量、响应时间要求等。 数据流图既是需求分析的工具,也是需求分析的成果之一。数据字典是进行数据收集和数据分析的主要成果。 (3) 需求信息的评审 开发过程中的每一个阶段都要经过评审,确认任务是否全部完成,避免或纠正工作中出现的错误和疏漏。聘请项目外的专家参与评审,可保证评审的质量和客观性。 评审可能导致开发过程回溯,甚至会反复多次。但是,一定要使全部的预期目标都达到才能让需求分析阶段的工作暂告一个段落 需求分析阶段的工作成果是写出一份既切合实际又具有预见的需求说明书,并且附以一整套详尽的数据流图和数据字典。 3概念模型设计概念模型不依赖于具体的计算机系统,他是纯粹反映信息需求的概念结构。 建模是在需求分析结果的基础上展开,常常要对数据进行抽象处理。常用的数据抽象方法是‘聚集’和‘概括’。 er方法是设计概念模型时常用的方法。用设计好的er图再附以相应的说明书可作为阶段成果 概念模型设计可分三步完成。 (1) 设计局部概念模型 ① 确定局部概念模型的范围 ② 定义实体 ③ 定义联系 ④ 确定属性 ⑤ 逐一画出所有的局部er图,并附以相应的说明文件 (2) 设计全局概念模型 建立全局er图的步骤如下: ① 确定公共实体类型 ② 合并局部er图 ③ 消除不一致因素 ④ 优化全局er图 ⑤ 画出全局er图,并附以相应的说明文件。 (3) 概念模型的评审 概念模型的评审分两部分进行 第一部分是用户评审。 第二部分是开发人员评审。 4逻辑设计逻辑设计阶段的主要目标是把概念模型转换为具体计算机上dbms所支持的结构数据模型。 逻辑设计的输入要素包括:概念模式、用户需求、约束条件、选用的dbms的特性。 逻辑设计的输出信息包括:dbms可处理的模式和子模式、应用程序设计指南、物理设计指南。 (1) 设计模式与子模式 关系数据库的模式设计可分四步完成。 ① 建立初始关系模式 ② 规范化处理 ③ 模式评价 ④ 修正模式 经过多次的模式评价和模式修正,确定最终的模式和子模式。 写出逻辑数据库结构说明书。 (2) 编写应用程序设计指南 根据设计好的模式和应用需求,规划应用程序的架构,设计应用程序的草图,指定每个应用程序的数据存取功能和数据处理功能梗概,提供程序上的逻辑接口。 编写出应用程序设计指南。 (3) 编写物理设计指南。 根据设计好的模式和应用需求,整理出物理设计阶段所需的一些重要数据和文档。例如,数据库的数据容量、各个关系(文件)的数据容量、应用处理频率、 *** 作顺序、响应速度、各个应用的lra和tv、程序访问路径建议,等等。这些数据和要求将直接用于物理数据库的设计。 编写出物理设计指南。 5物理设计物理设计是对给定的逻辑数据模型配置一个最适合应用环境的物理结构。 物理设计的输入要素包括:模式和子模式、物理设计指南、硬件特性、os和dbms的约束、运行要求等。 物理设计的输出信息主要是物理数据库结构说明书。其内容包括物理数据库结构、存储记录格式、存储记录位置分配及访问方法等。 物理设计的步骤如下: (1) 存储记录结构 设计综合分析数据存储要求和应用需求,设计存储记录格式。 (2) 存储空间分配 存储空间分配有两个原则: ①存取频度高的数据尽量安排在快速、随机设备上,存取频度低的数据则安排在速度较慢的设备上。 ②相互依赖性强的数据尽量存储在同一台设备上,且尽量安排在邻近的存储空间上。 从提高系统性能方面考虑,应将设计好的存储记录作为一个整体合理地分配物理存储区域。尽可能充分利用物理顺序特点,把不同类型的存储记录指派到不同的物理群中。 (3) 访问方法的设计 一个访问方法包括存储结构和检索机构两部分。存储结构限定了访问存储记录时可以使用的访问路径;检索机构定义了每个应用实际使用的访问路径。 (4) 物理设计的性能评价 ① 查询响应时间 从查询开始到有结果显示之间所经历的时间称为查询响应时间。查询响应时间可进一步细分为服务时间、等待时间和延迟时间。 在物理设计过程中,要对系统的性能进行评价。性能评价包括时间、空间、效率、开销等各个方面。 ⊙ cpu服务时间和i/o服务时间的长短取决于应用程序设计。 ⊙ cpu队列等待时间和i/o队列等待时间的长短受计算机系统作业的影响。 ⊙ 设计者可以有限度地控制分布式数据库系统的通信延迟时间。 ② 存储空间 存储空间存放程序和数据。程序包括运行的应用程序、dbms子程序、os子程序等。数据包括用户工作区、dbms工作区、os工作区、索引缓冲区、数据缓冲区等。 存储空间分为主存空间和辅存空间。设计者只能有限度地控制主存空间,例如可指定缓冲区的分配等。但设计者能够有效地控制辅存空间。 ③ 开销与效率 设计中还要考虑以下各种开销,开销增大,系统效率将下降。 ⊙ 事务开销指从事务开始到事务结束所耗用的时间。更新事务要修改索引、重写物理块、进行写校验等 *** 作,增加了额外的开销。更新频度应列为设计的考虑因素。 ⊙ 报告生成开销指从数据输入到有结果输出这段时间。报告生成占用cpu及i/o的服务时间较长。设计中要进行筛选,除去不必要的报告生成。 ⊙ 对数据库的重组也是一项大的开销。设计中应考虑数据量和处理频度这两个因数,做到避免或尽量减少重组数据库。 在物理设计阶段,设计、评价、修改这个过程可能要反复多次,最终得到较为完善的物理数据库结构说明书。 建立数据库时,dba依据物理数据库结构说明书,使用dbms提供的工具可以进行数据库配置。 在数据库运行时,dba监察数据库的各项性能,根据依据物理数据库结构说明书的准则,及时进行修正和优化 *** 作,保证数据库系统能够保持高效率地运行。 6程序编制及调试在逻辑数据库结构确定以后,应用程序设计的编制就可以和物理设计并行地展开 程序模块代码通常先在模拟的环境下通过初步调试,然后再进行联合调试。联合调试的工作主要有以下几点: (1) 建立数据库结构 根据逻辑设计和物理设计的结果,用dbms提供的数据语言(ddl)编写出数据库的源模式,经编译得到目标模式,执行目标模式即可建立实际的数据库结构。 (2) 调试运行 数据库结构建立后,装入试验数据,使数据库进入调试运行阶段。运行应用程序,测试 (3) 装入实际的初始数据 在数据库正式投入运行之前,还要做好以下几项工作: (1) 制定数据库重新组织的可行方案。 (2) 制定故障恢复规范 (3) 制定系统的安全规范 7运行和维护数据库正式投入运行后,运行维护阶段的主要工作是: (1) 维护数据库的安全性与完整性。 按照制定的安全规范和故障恢复规范,在系统的安全出现问题时,及时调整授权和更改密码。及时发现系统运行时出现的错误,迅速修改,确保系统正常运行。把数据库的备份和转储作为日常的工作,一旦发生故障,立即使用数据库的最新备份予以恢复。 (2) 监察系统的性能。 运用dbms提供的性能监察与分析工具,不断地监控着系统的运行情况。当数据库的存储空间或响应时间等性能下降时,立即进行分析研究找出原因,并及时采取措施改进。例如,可通修改某些参数、整理碎片、调整存储结构或重新组织数据库等方法,使数据库系统保持高效率地正常运作。 (3) 扩充系统的功能 在维持原有系统功能和性能的基础上,适应环境和需求的变化,采纳用户的合理意见,对原有系统进行扩充,增加新的功能。
数据库应用系统的开发是一项软件工程。一般可分为以下几个阶段:
1规划 2需求分析 3概念模型设计 4 逻辑设计5物理设计 6程序编制及调试 7运行及维护。 这些阶段的划分目前尚无统一的标准,各阶段间相互联接,而且常常需要回溯修正。 在数据库应用系统的开发过程中,每个阶段的工作成果就是写出相应的文档。每个阶段都是在上一阶段工作成果的基础上继续进行,整个开发工程是有依据、有组织、有计划、有条不紊地展开工作。
1规划规划的主要任务就是作必要性及可行性分析。 在收集整理有关资料的基础上,要确定将建立的数据库应用系统与周边的关系,要对应用系统定位,其规模的大小、所处的地位、应起的作用均须作全面的分析和论证。 明确应用系统的基本功能,划分数据库支持的范围。分析数据来源、数据采集的方式和范围,研究数据结构的特点,估算数据量的大小,确立数据处理的基本要求和业务的规范标准。 规划人力资源调配。对参与研制和以后维护系统运作的管理人员、技术人员的技术业务水平提出要求,对最终用户、 *** 作员的素质作出评估。 拟定设备配置方案。论证计算机、网络和其他设备在时间、空间两方面的处理能力,要有足够的内外存容量,系统的响应速度、网络传输和输入输出能力应满足应用需求并留有余量。要选择合适的os,dbms和其它软件。设备配置方案要在使用要求、系统性能、购置成本和维护代价各方面综合权衡。 对系统的开发、运行、维护的成本作出估算。预测系统效益的期望值。 拟定开发进度计划,还要对现行工作模式如何向新系统过渡作出具体安排。 规划阶段的工作成果是写出详尽的可行性分析报告和数据库应用系统规划书。内容应包括:系统的定位及其功能、数据资源及数据处理能力、人力资源调配、设备配置方案、开发成本估算、开发进度计划等。 可行性分析报告和数据库应用系统规划书经审定立项后,成为后续开发工作的总纲。 2需求分析需求分析大致可分成三步来完成。 (1) 需求信息的收集, 需求信息的收集一般以机构设置和业务活动为主干线,从高层中层到低层逐步展开 (2) 需求信息的分析整理, 对收集到的信息要做分析整理工作。数据流图(dfd, data flow diagram)是业务流程及业务中数据联系的形式描述。图41是一个简单的dfd 示例。 数据字典(dd, data dictionary)详细描述系统中的全部数据。 数据字典包含以下几个部分。 数据项:是数据的原子单位。 数据组项:由若干数据项组成。 数据流:表示某一数据加工过程的输入/输出数据。 数据存储:是处理过程中要存取的数据。 数据加工过程 数据加工过程的描述包括:数据加工过程名、说明、输入、输出、加工处理工作摘要、加工处理频度、加工处理的数据量、响应时间要求等。 数据流图既是需求分析的工具,也是需求分析的成果之一。数据字典是进行数据收集和数据分析的主要成果。 (3) 需求信息的评审 开发过程中的每一个阶段都要经过评审,确认任务是否全部完成,避免或纠正工作中出现的错误和疏漏。聘请项目外的专家参与评审,可保证评审的质量和客观性。 评审可能导致开发过程回溯,甚至会反复多次。但是,一定要使全部的预期目标都达到才能让需求分析阶段的工作暂告一个段落 需求分析阶段的工作成果是写出一份既切合实际又具有预见的需求说明书,并且附以一整套详尽的数据流图和数据字典。 3概念模型设计概念模型不依赖于具体的计算机系统,他是纯粹反映信息需求的概念结构。 建模是在需求分析结果的基础上展开,常常要对数据进行抽象处理。常用的数据抽象方法是‘聚集’和‘概括’。 er方法是设计概念模型时常用的方法。用设计好的er图再附以相应的说明书可作为阶段成果 概念模型设计可分三步完成。 (1) 设计局部概念模型 ① 确定局部概念模型的范围 ② 定义实体 ③ 定义联系 ④ 确定属性 ⑤ 逐一画出所有的局部er图,并附以相应的说明文件 (2) 设计全局概念模型 建立全局er图的步骤如下: ① 确定公共实体类型 ② 合并局部er图 ③ 消除不一致因素 ④ 优化全局er图 ⑤ 画出全局er图,并附以相应的说明文件。 (3) 概念模型的评审 概念模型的评审分两部分进行 第一部分是用户评审。 第二部分是开发人员评审。 4逻辑设计逻辑设计阶段的主要目标是把概念模型转换为具体计算机上dbms所支持的结构数据模型。 逻辑设计的输入要素包括:概念模式、用户需求、约束条件、选用的dbms的特性。 逻辑设计的输出信息包括:dbms可处理的模式和子模式、应用程序设计指南、物理设计指南。 (1) 设计模式与子模式 关系数据库的模式设计可分四步完成。 ① 建立初始关系模式 ② 规范化处理 ③ 模式评价 ④ 修正模式 经过多次的模式评价和模式修正,确定最终的模式和子模式。 写出逻辑数据库结构说明书。 (2) 编写应用程序设计指南 根据设计好的模式和应用需求,规划应用程序的架构,设计应用程序的草图,指定每个应用程序的数据存取功能和数据处理功能梗概,提供程序上的逻辑接口。 编写出应用程序设计指南。 (3) 编写物理设计指南。 根据设计好的模式和应用需求,整理出物理设计阶段所需的一些重要数据和文档。例如,数据库的数据容量、各个关系(文件)的数据容量、应用处理频率、 *** 作顺序、响应速度、各个应用的lra和tv、程序访问路径建议,等等。这些数据和要求将直接用于物理数据库的设计。 编写出物理设计指南。 5物理设计物理设计是对给定的逻辑数据模型配置一个最适合应用环境的物理结构。 物理设计的输入要素包括:模式和子模式、物理设计指南、硬件特性、os和dbms的约束、运行要求等。 物理设计的输出信息主要是物理数据库结构说明书。其内容包括物理数据库结构、存储记录格式、存储记录位置分配及访问方法等。 物理设计的步骤如下: (1) 存储记录结构 设计综合分析数据存储要求和应用需求,设计存储记录格式。 (2) 存储空间分配 存储空间分配有两个原则: ①存取频度高的数据尽量安排在快速、随机设备上,存取频度低的数据则安排在速度较慢的设备上。 ②相互依赖性强的数据尽量存储在同一台设备上,且尽量安排在邻近的存储空间上。 从提高系统性能方面考虑,应将设计好的存储记录作为一个整体合理地分配物理存储区域。尽可能充分利用物理顺序特点,把不同类型的存储记录指派到不同的物理群中。 (3) 访问方法的设计 一个访问方法包括存储结构和检索机构两部分。存储结构限定了访问存储记录时可以使用的访问路径;检索机构定义了每个应用实际使用的访问路径。 (4) 物理设计的性能评价 ① 查询响应时间 从查询开始到有结果显示之间所经历的时间称为查询响应时间。查询响应时间可进一步细分为服务时间、等待时间和延迟时间。 在物理设计过程中,要对系统的性能进行评价。性能评价包括时间、空间、效率、开销等各个方面。 ⊙ cpu服务时间和i/o服务时间的长短取决于应用程序设计。 ⊙ cpu队列等待时间和i/o队列等待时间的长短受计算机系统作业的影响。 ⊙ 设计者可以有限度地控制分布式数据库系统的通信延迟时间。 ② 存储空间 存储空间存放程序和数据。程序包括运行的应用程序、dbms子程序、os子程序等。数据包括用户工作区、dbms工作区、os工作区、索引缓冲区、数据缓冲区等。 存储空间分为主存空间和辅存空间。设计者只能有限度地控制主存空间,例如可指定缓冲区的分配等。但设计者能够有效地控制辅存空间。 ③ 开销与效率 设计中还要考虑以下各种开销,开销增大,系统效率将下降。 ⊙ 事务开销指从事务开始到事务结束所耗用的时间。更新事务要修改索引、重写物理块、进行写校验等 *** 作,增加了额外的开销。更新频度应列为设计的考虑因素。 ⊙ 报告生成开销指从数据输入到有结果输出这段时间。报告生成占用cpu及i/o的服务时间较长。设计中要进行筛选,除去不必要的报告生成。 ⊙ 对数据库的重组也是一项大的开销。设计中应考虑数据量和处理频度这两个因数,做到避免或尽量减少重组数据库。 在物理设计阶段,设计、评价、修改这个过程可能要反复多次,最终得到较为完善的物理数据库结构说明书。 建立数据库时,dba依据物理数据库结构说明书,使用dbms提供的工具可以进行数据库配置。 在数据库运行时,dba监察数据库的各项性能,根据依据物理数据库结构说明书的准则,及时进行修正和优化 *** 作,保证数据库系统能够保持高效率地运行。 6程序编制及调试在逻辑数据库结构确定以后,应用程序设计的编制就可以和物理设计并行地展开 程序模块代码通常先在模拟的环境下通过初步调试,然后再进行联合调试。联合调试的工作主要有以下几点: (1) 建立数据库结构 根据逻辑设计和物理设计的结果,用dbms提供的数据语言(ddl)编写出数据库的源模式,经编译得到目标模式,执行目标模式即可建立实际的数据库结构。 (2) 调试运行 数据库结构建立后,装入试验数据,使数据库进入调试运行阶段。运行应用程序,测试 (3) 装入实际的初始数据 在数据库正式投入运行之前,还要做好以下几项工作: (1) 制定数据库重新组织的可行方案。 (2) 制定故障恢复规范 (3) 制定系统的安全规范 7运行和维护数据库正式投入运行后,运行维护阶段的主要工作是: (1) 维护数据库的安全性与完整性。 按照制定的安全规范和故障恢复规范,在系统的安全出现问题时,及时调整授权和更改密码。及时发现系统运行时出现的错误,迅速修改,确保系统正常运行。把数据库的备份和转储作为日常的工作,一旦发生故障,立即使用数据库的最新备份予以恢复。 (2) 监察系统的性能。 运用dbms提供的性能监察与分析工具,不断地监控着系统的运行情况。当数据库的存储空间或响应时间等性能下降时,立即进行分析研究找出原因,并及时采取措施改进。例如,可通修改某些参数、整理碎片、调整存储结构或重新组织数据库等方法,使数据库系统保持高效率地正常运作。 (3) 扩充系统的功能 在维持原有系统功能和性能的基础上,适应环境和需求的变化,采纳用户的合理意见,对原有系统进行扩充,增加新的功能。
1什么是Redis一款内存高速缓存数据库(全称远程数据服务);使用C语言编写Redis是一个key-value存储系统,它支持丰富的数据类型,如:string、list、set、zset(sortedset)、hash等2Redis特点Redis以内存作为数据存储介质,所以读写数据的效率极高,远远超过数据库。以设置和获取一个256字节字符串为例,它的读取速度可高达110000次/s,写速度高达81000次/s。储存在Redis中的数据是持久化的,断电或重启后,数据也不会丢失。-----Redis的存储分为内存存储、磁盘存储和log文件三部分,重启后,Redis可以从磁盘重新将数据加载到内存中。(实现持久化)3Redis应用场景,它能做什么在服务器中常用来存储一些需要频繁调取的数据,这样可以大大节省系统直接读取磁盘来获得数据的I/O开销,更重要的是可以极大提升速度。(拿大型网站来举个例子,比如a网站首页一天有100万人访问,其中有一个板块为推荐新闻。要是直接从数据库查询,那么一天就要多消耗100万次数据库请求。上面已经说过,Redis支持丰富的数据类型,所以这完全可以用Redis来完成,将这种热点数据存到Redis(内存)中,要用的时候,直接从内存取,极大的提高了速度和节约了服务器的开销。)使用Redis有哪些好处?(1)速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和 *** 作的时间复杂度都是O(1)(2)支持丰富数据类型,支持string,list,set,sortedset,hash(3)支持事务, *** 作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行(4)丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除redis相比memcached有哪些优势?(1)memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型(2)redis的速度比memcached快很多(3)redis可以持久化其数据redis常见性能问题和解决方案:(1)Master最好不要做任何持久化工作,如RDB内存快照和AOF日志文件(2)如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次(3)为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内(4)尽量避免在压力很大的主库上增加从库(5)主从复制不要用图状结构,用单向链表结构更为稳定4redis和mysql的区别总结(1)类型上从类型上来说,mysql是关系型数据库,redis是缓存数据库(2)作用上mysql用于持久化的存储数据到硬盘,功能强大,但是速度较慢redis用于存储使用较为频繁的数据到缓存中,读取速度快(3)需求上mysql和redis因为需求的不同,一般都是配合使用。5redis和mysql要根据具体业务场景去选型redis和mysql要根据具体业务场景去选型mysql:数据放在磁盘redis:数据放在内存mysql支持sql查询,可以实现一些关联的查询以及统计;redis对内存要求比较高,在有限的条件下不能把所有数据都放在redis;mysql偏向于存数据,redis偏向于快速取数据,但redis查询复杂的表关系时不如mysql,所以可以把热门的数据放redis,mysql存基本数据
以上就是关于介绍一下数据库事务全部的内容,包括:介绍一下数据库事务、关系型数据库的常见功能、Java 理论与实践: 正确使用 volatile 变量 线程同步等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)