定义
持久化(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的对象存储在关系型的数据库中,当然也可以存储在磁盘文件中、XML数据文件中等等。
持久化是将程序数据在持久状态和瞬时状态间转换的机制。JDBC就是一种持久化机制。文件IO也是一种持久化机制。将鲜肉冷藏,吃的时候再解冻的方法也是。将水果做成罐头的方法也是。将人的脏器迅速冷冻,运输,然后解冻给人移植的技术也是。
理解
我们这样理解:在一定周期内保持不变就是持久化,持久化是针对时间来说的。数据库中的数据就是持久化了的数据,只要你不去删除或修改。比如在IE浏览器中一次Session会话中Session对象变量也是不变的,是Session容器中持久化。对象持久化的方式有很多种,根据周期不同有,page,Session,Application。
对象序列化机制对于需要将对象的状态保存到文件中,而后能够通过读入对象状态来重新构造对象,恢复程序状态,对象序列化的过程是对象持久化的方法之一,把对象保存到文件中。
二个层面
简单的理解持久化可以在二个层面:应用层和系统层。
应用层,如果关闭(shutdown)你的应用然后重新启动则先前的数据依然存在。
系统层,如果关闭(shutdown)你的系统(电脑)然后重新启动则先前的数据依然存在。
为什么要持久化
持久化是一种对象服务,就是把内存中的对象保存到外存中,让以后能够取回。需要实现至少3个接口:
void Save(object o) 把一个对象保存到外存中
Object Load(object oid) 通过对象标识从外存中取回对象
bool Exists(object oid) 检查外存中是否存在某个对象
为什么需要持久化服务呢?那是由于内存本身的缺陷引起的:内存掉电后数据会丢失,但有一些对象是无论如何都不能丢失的,比如银行账号,遗憾的是,人们还无法保证内存永不掉电。
内存过于昂贵,与硬盘、磁带、光盘等外存相比,内存的价格要高2~3个数量级,而且维持成本也高,至少需要一直供电吧。所以即使对象不需要永久保存,也会因为内存的容量限制不能一直呆在内存中,需要持久化来缓存到外存。
既然持久化服务在看得到的未来还有市场,我们就来看看如何构建一个好的持久化框架,框架是否真的好在于如何在扩展性、缩放性、重用性上取得良好的平衡:扩展性,如果一个持久性框架不能支持用户定义的类型,显然不是一个好的框架。缩放性,保存和取回对象都需要耗费cpu、带宽、时间资源,哪一个消耗太多都不能接受。重用性,是我们建立框架的初衷,就是通过框架能够减少一些编码和测试的工作量。这几个需求往往是互相冲突的,所以关键是平衡。
我们先跳开一下,看看另一个类似的有用概念:序列化,序列化也是一种对象服务,就是把内存中的对象序列化成流、或者把流反序列化成对象。需要实现2个接口:
void Serialize(Stream stream,object o) 把对象序列化到流中
object Deserialize(Stream stream) 把流反序列化成对象
序列化和持久化很相似,有些人甚至混为一谈,其实还是有区别的,序列化是为了解决对象的传输问题,传输可以在线程之间、进程之间、内存外存之间、主机之间进行。我之所以在这里提到序列化,是因为我们可以利用序列化来辅助持久化,可以说凡是可以持久化的对象都可以序列化,因为序列化相对容易一些(也不是很容易),所以主流的软件基础设施,比如.net和java,已经把序列化的框架完成了。
持久化方案可以分为关系数据库方案、文件方案、对象数据库方案、xml数据库方案,目前主流的持久化方案是关系数据库方案,关系数据库方案不仅解决了并发的问题,更重要的是,关系数据库还提供了持久化服务之外的价值:统计分析功能。刚才我说到,凡是可以序列化的对象都可以持久化,极端的说,我们可以只建立一个表Object(OID,Bytes),但基本上没有人这么做,因为一旦这样,我们就失去了关系数据库额外的统计分析功能。关系数据库和面向对象之间有一条鸿沟,因为二者模式不匹配,所以就存在一个OR映射问题。
持久化的意义
当持久化兴起的时候,逐渐形成了实体层这个概念了。hibernate,jdo,以及博客园的nbear都可谓是大名鼎鼎!有的公司不使用这种ORM框架,他们使用一些自动生成工具生成实体(例如用Codesmith生成),并生成和该表对应的业务逻辑,于是乎感觉我们的程序好像一下子全都写好了,下一步就轻松了,我们只要扩展业务即可了!莫非这样真是那么方便了?在维护上真的是最便捷吗? 其它的持久层解决方案不敢说,但至少我觉得像orm的鼻祖hibernate那种开发机制,在维护还是相当之麻烦呀!一个实体还得对应一个xml文件(虽说这些都可以自动生成),但是你深入项目的时候去想想,我们的业务真能一切都可以定下来吗?人的思想总是在变的,客户的需求就更难以琢磨了!哪天我们要给程序加个字段,你想想你必须要走几步改动?首先我们必须重新生成xml和实体,然后我们必须还得在业务逻辑中增加代码,还得在视图层加一个界面(如加一个input输入框等)!讲实话,加一个字段对这种orm框架的改动还是最少的,哪天假如说我们修改了哪个字段的名称、修改了字段类型,你想想,天呐!很难想像,和这个字段关联的程序都得改动!如果名称改了,ok,你可以全部替换它的原先名称,改成你新的名称。那类型改了呢?没办法只能手工一个个改掉所有的赋值的类型吧?视图层、控制层中的验证(js验证,业务验证)、逻辑层、实体层,xml配置等等都必须动。搞啥个hsq,这和sql不差不多了吗(虽然说hsq,抽象了数据库模型)?不过我想没有程序员不懂sql的吧?况且hsq对复杂的语句还是会力不从心的吧!
运用ORM框架势必会运用大量的反射,代价是牺牲性能。当然现在的各种ORM框架都在尝试使用各种方法来减轻这块(LazyLoad,Cache),效果还是很显著的。可是我们牺牲了这么大的性能,而且我是觉得在维护上ORM还是最便捷。
真不知道为啥像hibernate这样的框架还有一个xml配置文件?如果我用ORM的话,我把这些数据关系缓存起来,动态取关系不就行了吗?这样我不更灵活了吗?
当然使用ORM也有它的灵活之处,在维护上那种自动生成的方式(petshop模式)比使用ORM框架维护量上更大一些,那种构架如果是每个数据操作对应一个存储过程的改动会更会让人晕头转向的。
其构架大致如以下描述:
主要由BLL,MODEL,DAL三层构架方式实现,BLL存放的是相关业务,MODEL是相关的数据库表格实体,DAL业务的SQL语句(或存储过程参数)。为了松散耦合,在BLL层和DAL层中间加入了工厂层(Factory),其作用是方便DAL层的载体变动(如把Sqlserver改成Mysql),在DAL层有一个setObject数据库字段到实体属性设置,便于数据库表格映射成实体。
程序编写的最大问题就是耦合高,怎么降耦也是开发的一个重中之重。以上述的程序构架来看,如果我改动了数据库中的其中一个表格的某个字段,程序改动的至少就有三层。如果再按照自动生成方式那种看,DAL中的update,insert,select, setObject都需要改动,如果存在存储过程的话,像get,getAll,update,insert都必须改动,想象一下这里改动地方有几处了?而且还需改动Model层,修改量之大可见一斑。当然我们这里可以用自动生成工具生成并替换,可又有谁知道这里面的替换工作量多少?
总之,提倡"高内聚,低耦合"是构架永恒的话题,寻找便捷亦是构架的终级目标。
持久化的相关实现Hibernate
hibernate为应用程序提供了高效的O/R关系映射和查询服务,为面向对象的领域模型到传统的关系型数据库的映射提供了一个使用方便的框架。
JPA
JPA(Java Persistense API)是EJB3.0的一部分,为其提供了一套O/R关系映射的API,但不仅限于EJB中使用,它也可以在web应用或者应用程序客户端中被使用,甚至在Java桌面程序中被使用。
转自:
http://hi.baidu.com/chaoling604605/item/9f1530cc2fb22f3dee46653b
分享到:
相关推荐
MySQL 规则持久化则是 Sentinel 功能的一个重要组成部分,它确保了在系统重启或者故障恢复后, Sentinel 的规则能够被正确地加载,从而维持服务的稳定运行。 在本项目中,"sentinel-mysql规则持久化" 是一个将 ...
Redis是一种内存数据库,它支持数据的持久化,确保数据的持久性和安全性。持久化是指将内存中的数据保存到磁盘上,以便在Redis服务器重启或者系统崩溃之后,数据依然能够得以保存和恢复。Redis提供了两种持久化方案...
在IBM WebSphere MQ中,消息持久化是一个重要的特性,它确保了当队列管理器发生异常时,消息数据的安全性和一致性。以下是对IBM WebSphere MQ消息持久化相关知识点的详细说明。 首先,消息持久化是指消息的可靠性...
### 域对象在持久化层的状态:深入解析 在软件开发中,特别是涉及数据库操作的应用场景下,理解和掌握域对象在持久化层的状态对于优化系统性能和维护数据一致性至关重要。本文将围绕“域对象在持久化层的状态”这一...
版本 1.8.3 是 Sentinel 的一个重要更新,它引入了对 Nacos 的持久化支持,使得 Sentinel 的规则可以持久化存储在 Nacos 中,方便管理和跨实例共享。 Nacos 是一个阿里巴巴开源的动态服务发现、配置管理和服务管理...
为了解决这个问题,可以使用redux-persist库,它能够将Redux store的状态持久化到本地存储中。 redux-persist是专为Redux设计的一个中间件,它支持多种不同的持久化存储方式,最常见的是将数据保存到localStorage和...
在 Windows 操作系统环境下,Consul 的配置文件默认情况下并不具备持久化存储的特性,这意味着一旦服务器重启或遭遇意外断电,所有未被保存的配置更改将会丢失,这对服务的稳定性和可靠性构成了潜在风险。...
### WF 4.0 之持久化操作 #### 概述 在工作流(WF)领域,特别是针对WF 4.0版本的理解中,“WF 4.0 之持久化操作”这一主题聚焦于如何有效地将工作流的状态保存下来,以便在后续的操作中能够继续执行。持久化操作...
标题中的“自己写的一个持久化层”指的是作者创建了一个用于数据存储和检索的软件组件,类似于知名的ORM(对象关系映射)框架Hibernate。持久化层是应用程序中的一个关键部分,它负责将业务对象的数据保存到数据库中...
在iOS开发中,数据持久化是至关重要的,它允许应用程序在用户关闭应用或者设备重启后仍然保留数据。本文将深入探讨iOS中的几种主要数据持久化技术:Preference(偏好设置)、文件存储、归档、数据库(SQLite)以及...
在生产环境中,为了保证消息的可靠性,通常会使用持久化存储来保存消息,即使在服务重启后也能恢复数据。本主题主要探讨如何将ActiveMQ配置为使用MySQL 8作为其持久化存储方式,以及在这个过程中所需的Jar包。 1. *...
### Redis持久化方式详解 Redis 是一款高性能的键值存储系统,因其卓越的读写速度、丰富的数据结构以及灵活的应用场景而备受青睐。为了保证数据的安全性和持久性,Redis 提供了两种主要的持久化机制:RDB 快照...
它支持持久化任务和触发器到数据库,确保即使在系统重启后也能恢复先前的任务安排。本篇将详细介绍Quartz如何实现数据库持久化,并提供各类型数据库的SQL创建语句。 Quartz的持久化机制依赖于一组特定的数据库表,...
### Java持久化的解决方案详解 #### 引言:信息载体与持久化需求 在软件工程领域,数据持久化是一项至关重要的技术,它确保了应用程序在不同会话之间或系统重启后仍能保持数据的一致性和完整性。Java作为一种广泛...
而"nacos持久化数据库"指的是Nacos如何将服务数据和配置信息存储到数据库中,以确保在系统重启或故障后能够恢复这些关键数据。在Nacos中,默认情况下使用的是内存存储,但为了数据可靠性,通常会配置数据持久化到...
2. **消息持久化**:消息持久化是为了在服务器重启或网络故障后仍然能够恢复未处理的消息。通过设置消息和交换机为持久化,即使RabbitMQ重启,消息也不会丢失。 3. **备用交换机(Backup Exchange)**:在主交换机...
在Java的持久化框架中,Hibernate是一个非常流行的ORM(对象关系映射)工具,它能够将数据库中的数据与Java对象进行映射,从而简化数据库操作。"Hibernate自动生成持久化类和映射文件"这个话题主要涉及如何利用...
内容:已经对源码进行改造,使用push方式进行规则持久化 持久化的规则有:授权规则、降级规则、流控规则、热点规则、系统规则 其他说明:默认请求的nacos地址是127.0.0.1:8848 注意!注意!注意!:这个是源码,...
这个压缩包“Quartz.net 3.0.7.0数据库持久化.rar”包含了关于如何使用Quartz.NET实现任务调度的数据库持久化和集群配置的资料。Quartz.NET 3.0.7.0是该库的一个稳定版本,它提供了许多改进和新特性。 **数据库持久...
数据持久化技术是软件开发中一个关键的概念,它旨在解决对象型编程语言(如Java)与关系型数据库之间数据交互的挑战。通过持久化,我们可以将应用程序中的对象状态保存到数据库中,以便在后续的使用中能恢复这些状态...