持久化(Persistence)

1、概念:

  持久化是将程序数据在持久状态和瞬时状态间转换的机制。通俗的讲,就是瞬时数据(比如内存中的数据,是不能永久保存的)持久化为持久数据(比如持久化至数据库中,能够长久保存)。

持久化,即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)

2、主要应用 

  将 内存中的对象 存储在 数据库 中,或者存储在 磁盘文件中、XML数据文件中 等等。

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

3、理解 

  在一定周期内保持不变就是持久化,持久化是针对时间来说的。数据库中的数据就是持久化了的数据,只要你不去删除或修改。

  比如在IE浏览器中一次Session会话中Session对象变量也是不变的,是Session容器中持久化。
       对象持久化的方式有很多种,根据周期不同有page、Session、Application。
 
  对象序列化机制需要将对象的状态保存到文件中,而后能够通过读入对象状态来重新构造对象,恢复程序状态,
  对象序列化的过程是对象持久化的方法之一,把对象保存到文件中。
 
4、两个层面 
  

应用层

系统层

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

5、特点 

对象

市场

序列化

持久化是一种对象服务,就是把内存中的对象保存到外存中,让以后能够取回。

需要实现至少3个接口:

  • void Save(object o) 把一个对象保存到外存中
  • Object Load(object oid) 通过对象标识从外存中取回对象
  • boolExists(object oid) 检查外存中是否存在某个对象

为什么需要持久化服务呢?那是由于内存本身的缺陷引起的

内存掉电后数据会丢失,但有一些对象是无论如何都不能丢失的,
比如银行账号,遗憾的是,人们还无法保证内存永不掉电。
内存很昂贵,与硬盘、磁带、光盘等外存相比,内存价格要高2~3个数量级,
而且维持成本也高,至少需要一直供电吧。
所以即使对象不需要永久保存,也会因为内存的容量限制不能一直呆在内存中,需要持久化来缓存到外存。

如何构建一个好的持久化框架?

框架是否好在于在扩展性、缩放性、重用性上取得良好的平衡: 

  • 扩展性,一个持久性框架不能支持用户定义的类型,显然不是一个好的框架。
  • 缩放性,保存和取回对象都需要耗费cpu、带宽、时间资源,哪一个消耗太多都不能接受。
  • 重用性,是我们建立框架的初衷,通过框架能够减少一些编码和测试的工作量。
这几个需求往往是互相冲突的,所以关键是平衡。

也是一种对象服务,就是把内存中的对象序列化成流、或者把流反序列化成对象

需要实现2个接口:

  • voidSerialize (Stream stream,object o) 把对象序列化到流中
  • object Deserialize(Stream stream) 把流反序列化成对象 

序列化和持久化很相似,有些人甚至混为一谈,

其实还是有区别的?

序列化是为了解决对象的传输问题,

传输可以在线程之间、进程之间、内存外存之间、主机之间进行。

之所以在这里提到序列化?

是因为我们可以利用序列化来辅助持久化,

可以说凡是可以持久化的对象都可以序列化,

因为序列化相对容易一些(也不是很容易),

所以主流的软件基础设施,已经把序列化的框架完成了

比如.net和java

 

6、意义 

兴起原因

运用

   

7、相关实现 

Hibernate JPA(Java Persistense API) Mybatis

为应用程序提供了高效的O/R关系映射和查询服务,

面向对象的领域模型到传统的关系型数据库的映射,

提供了一个使用方便的框架。

是EJB3.0的一部分,为其提供了一套O/R关系映射的API,

但不仅限于EJB中使用,

它也可以在web应用或者应用程序客户端中被使用,

甚至在Java桌面程序中被使用。

也是一种orm框架。

 8、Koa 

  koa前后端分离session持久化(koa-mysql-session)

  koa-mysql-session 结合 koa-session-minimal 的方法 做 session 处理的中间件

koa-mysql-session  koa-session-minimal

为koa-session-minimal中间件提供MySQL数据库的session数据读写操作。

app.use( //session缓存设置
  session({
    key: 'USER_SID',
    store: new MysqlStore(sessionMysqlConfig),
    cookie: cookie,
  }),
);

 

 适用于koa2 的session中间件,提供存储介质的读写接口 

app.use(session({
        key: 'session-id',          // cookie 中存储 session-id 时的键名, 默认为 koa:sess
        cookie: {                   // 与 cookie 相关的配置
            domain: 'localhost',    // 写 cookie 所在的域名
            path: '/',              // 写 cookie 所在的路径
            maxAge: 1000 * 30,      // cookie 有效时长
            httpOnly: true,         // 是否只用于 http 请求中获取
            overwrite: false        // 是否允许重写
        }
}))

 

 

posted @ 2020-12-05 14:25  SlightFly  阅读(828)  评论(0编辑  收藏  举报