什么是持久化?

道貌岸然的意思2023-02-01  18

1.什么是持久化?本人找了好多文章都没有找到满意的答案,最后是从孙卫琴写的《精通Hibernate:Java对象持久化技术详解》中,看到如下的解释,感觉还是比较完整的。摘抄如下:狭义的理解:“持久化”仅仅指把域对象永久保存到数据库中;广义的理解,“持久化”包括和数据库相关的各种操作。● 保存:把域对象永久保存到数据库。● 更新:更新数据库中域对象的状态。● 删除:从数据库中删除一个域对象。● 加载:根据特定的OID,把一个域对象从数据库加载到内存。● 查询:根据特定的查询条件,把符合查询条件的一个或多个域对象从数据库加载内在存中。2.为什么要持久化?持久化技术封装了数据访问细节,为大部分业务逻辑提供面向对象的API。● 通过持久化技术可以减少访问数据库数据次数,增加应用程序执行速度;● 代码重用性高,能够完成大部分数据库操作;● 松散耦合,使持久化不依赖于底层数据库和上层业务逻辑实现,更换数据库时只需修改配置文件而不用修改代码。

数据持久化就是将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中的数据模型的统称. 数据模型可以是任何数据结构或对象模型,存储模型可以是关系模型、XML、二进制流等。cmp和Hibernate只是对象模型到关系模型之间转换的不同实现。

数据持久化对象的基本操作有:保存、更新、删除、查询等。

Hibernate框架中数据持久化机制:

在业务程序与数据库之间,Hibernate框架使用Session会话,来完成数据的提交、更新、删除、查询等等。

1、向数据库提交数据

在程序中保存对象时,会把数据保存到Session会话中,然后根据框架的配置文件,自动或手动决定什么时候把这种保存提交到数据库。

2、从数据库中查询数据

在查询数据之前,需要清理缓存(手动清理,或者通过配置文件框架自动清理)清理缓存的目的是为了使Session会话中的数据与数据库中的数据保持一致。然后程序只需要查询Session会话中的数据即可。

扩展资料:

使用数据持久化有以下好处:

1、程序代码重用性强,即使更换数据库,只需要更改配置文件,不必重写程序代码。

2、业务逻辑代码可读性强,在代码中不会有大量的SQL语言,提高程序的可读性。

3、持久化技术可以自动优化,以减少对数据库的访问量,提高程序运行效率。

参考资料来源:百度百科-数据持久化

数据持久化顾名思义就是把程序中的数据以某种形式保存到某存贮介质中,以达到持久化的目的。当程序运行时,一些数据是临时保存在内存中,一旦退出系统,这些数据就丢失了。那么,使用某种手段将数据保存在硬盘上或者数据库中,这样即使退出系统后又重新启动系统,那么这些数据仍然可以重新找回来。

例如管理员向一个用户管理系统中添加了一个用户的资料,那么这个系统需要将新添加的资料保存到数据库中,否则系统退出或者电脑重启后该用户资料就会丢失。将数据从内存保存到数据库中,这便是数据的持久化。当然,数据库只是持久化方式中的一种,也可以保存在其他的永久存贮介质中。

图为数据持久化的过程示意图。

持久化(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的对象存储在数据库中,或者存储在磁盘文件中、XML数据文件中等等。

持久化是将程序数据在持久状态和瞬时状态间转换的机制。

DBC就是一种持久化机制。文件IO也是一种持久化机制。

日常持久化的方法

在一定周期内保持不变就是持久化,持久化是针对时间来说的。数据库中的数据就是持久化了的数据,只要你不去删除或修改。比如在浏览器中一次Session会话中Session对象变量也是不变的,是Session容器中持久化。对象持久化的方式有很多种,根据周期不同有,page,Session,Application。对象序列化机制对于需要将对象的状态保存到文件中,而后能够通过读入对象状态来重新构造对象,恢复程序状态. 对象序列化的过程是对象持久化的方法之一,把对象保存到文件中。

简单的理解持久化可以在二个层面:应用层和系统层、

应用层

如果关闭(shutdown)你的应用然后重新启动则先前的数据依然存在。

系统层

如果关闭(shutdown)你的系统(电脑)然后重新启动则先前的数据依然存在。

持久化是一种对象服务实现至少3个接口

,就是把内存中的对象保存到外存中,让以后能够取回。需要实现至少3个接口:

void Save(object o) 把一个对象保存到外存中

Object Load(object oid) 通过对象标识从外存中取回对象

boolExists(object oid) 检查外存中是否存在某个对象.

类似概念序列化

我们先跳开一下,看看另一个类似的有用概念:序列化Serialize也是一种对象服务,就是把内存中的对象序列化成流、或者把流反序列化成对象。需要实现2个接口:

void Serialize(Stream stream,object o) 把对象序列化到流中

object Deserialize(Stream stream) 把流反序列化成对象

序列化和持久化很相似,有些人甚至混为一谈,其实还是有区别的,序列化是为了解决对象的传输问题,传输可以在线程之间、进程之间、内存外存之间、主机之间进行。我之所以在这里提到序列化,是因为我们可以利用序列化来辅助持久化,可以说凡是可以持久化的对象都可以序列化,因为序列化相对容易一些(也不是很容易),所以主流的软件基础设施,比如.net和java,已经把序列化的框架完成了。

持久化方案可以分为关系数据库方案、文件方案、对象数据库方案、xml数据库方案

现今主流的持久化方案是关系数据库方案,

关系数据库方案不仅解决了并发的问题,更重要的是,关系数据库还提供了持久化服务之外的价值:统计分析功能。刚才我说到,凡是可以序列化的对象都可以持久化,极端的说,我们可以只建立一个表Object(OID,Bytes),但基本上没有人这么做,因为一旦这样,我们就失去了关系数据库额外的统计分析功能。关系数据库和面向对象之间有一条鸿沟,因为二者模式不匹配,所以就存在一个OR映射问题。

Redis支持两种数据持久化方式:rdb方式和aof方式。前者会根据配置的规则定时将内存中的数据持久化到硬盘上,后者则是在每次执行写命令之后将命令记录下来。两种持久化方式可以单独使用,但是通常会将两者结合使用。

1、RDB方式

RDB方式的持久化是通过快照的方式完成的。当符合某种规则时,会将内存中的数据全量生成一份副本存储到硬盘上,这个过程称作”快照”,redis默认开启该持久化功能,具体配置如下:

save 900 1

save 300 10

save 60 10000

stop-writes-on-bgsave-error yes

rdbcompression yes

rdbchecksum yes

dbfilename dump.rdb

#文件名称

dir ./

#rdb文件存放路径

配置后系统会自动进行快照,save 60 10000表示60秒内有10000次写入,那么就会调用bgsave

除了系统自动进行快照外,我们也可以手动执行SAVE或BGSAVE命令主动进行快照操作:

执行SAVE或BGSAVE命令

执行FLUSHALL命令

2、AOF方式

在使用Redis存储非临时数据时,一般都需要打开AOF持久化来降低进程终止导致的数据丢失,AOF可以将Redis执行的每一条写命令追加到硬盘文件中,这一过程会降低Redis的性能。

默认情况下,Redis没有开启AOF(append only file)持久化功能,可以通过在配置文件中作如下配置启用:

appendonly no    #是否开启aof,开启时将no改为yes

appendfilename "appendonly.aof"   持久化文件名称

auto-aof-rewrite-percentage 100

#当前AOF文件大小是上次日志重写得到AOF文件大小的二倍时,自动启动新的日志重写过程。

auto-aof-rewrite-min-size 64mb

#当前AOF文件启动新的日志重写过程的最小值,避免刚刚启动Reids时由于文件尺寸较小导致频繁的重写。

appendfsync :everysec (推荐配置)

#持久化策略

always (同步持久化,每次发生数据变更会被立即记录到磁盘,性能差但数据完整性比较好)

everysec (异步操作,每秒记录,如果一秒钟内宕机,有数据丢失)

no  (将缓存回写的策略交给系统,linux 默认是30秒将缓冲区的数据回写硬盘的)

一般来说可以考虑同时使用两种持久化方案.


转载请注明原文地址:https://juke.outofmemory.cn/read/2860848.html

最新回复(0)