EclipseLink学习(五) --- 缓存

  看看官网的关于缓存的讲解,无奈自己的英语有限,只能边看边查,自己翻译的很生硬,结合网络上大神的指导,大概了解了一些内容。这篇文章就作为一个学习笔记吧。

 

咱们先了解几个名词:

ORM:对象关系映射

OXM:对象xml关系映射

 

     我目前学习的水平,只知道hibernate支持ORM(其实也稍微支持OXM),mybatis支持OXM。

     了解了EclipseLink之后,发现它不仅支持ORM,也支持OXM。

         那么缓存肯定也会有ORM和OXM之分。

 

 

咱们先看官网上的例子:

比如Employee类:

@Entity

@Cache(

  type=CacheType.SOFT, // 缓存一切东西,直到JVM内存不够为止.

  size=64000  // 使用64000作为初始缓存大小.

  expiry=36000000, 

  coordinationType=CacheCoordinationType.INVALIDATE_CHANGED_OBJECTS  //将这个属性设置为缓存协调模式。代表只发送无效的消息)

public class Employee {

  ...

}

 

 

在xml中应用缓存:

<entity-mappings

  xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/orm"

  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  xsi:schemaLocation="http://www.eclipse.org/eclipselink/xsds/persistence/orm

  http://www.eclipse.org/eclipselink/xsds/eclipselink_orm_2_4.xsd"

  version="2.4">

    <entity name="Employee" class="org.acme.Employee" access="FIELD">

      <cache type="SOFT" size="64000" expiry="36000000" coordination-type="INVALIDATE_CHANGED_OBJECTS"/>

    </entity>

</entity-mappings>

 

 

对应的持久化的xml中的配置如下:

<persistence xmlns="http://java.sun.com/xml/ns/persistence"

  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  xsi:schemaLocation="http://java.sun.com/xml/ns/persistence persistence_2_0.xsd"

  version="2.0">

    <persistence-unit name="acme" transaction-type="RESOURCE_LOCAL">

      <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>

        <exclude-unlisted-classes>false</exclude-unlisted-classes>

        <properties>

          <property name="eclipselink.cache.shared.default" value="false"/>

          <property name="eclipselink.cache.shared.Employee" value="true"/>

          <property name="eclipselink.cache.type.Employee" value="SOFT"/>

          <property name="eclipselink.cache.size.Employee" value="64000"/>

        </properties>

    </persistence-unit>

</persistence>

 

 

 

 

EclipseLink使用@Cache代替了Java Persisitence API 的(@Cachable)来配置EclipseLink对象缓存。

在默认情况下,EclipseLink使用共享对象缓存来缓存所有对象。你可以在每个类的基础上配置缓存类型和选项,允许最优缓存。

 

 

实体entity缓存类型

Full   :缓存所有查询到的实例,不会被GC回收

Weak:缓存以这个类型标识的实体查到的所有实例,会被GC回收

Soft:缓存以这个类型标识的实体查到的所有实例,当JVM内存不够的时候会被释放

Soft_weak(默认的):缓存所有以weak和soft标识的实体查到的所有实例。它会带有一个子缓存,用于存放经常读取的信息,这部分信息不会被GC回收。

Hard_weak:和soft_weak类似。只不过它的子缓存会用Hard引用存储。

Cache(不推荐使用):它使用map维护一个指定大小的缓存。

None(不推荐使用,可以使用isolation=ISOLATED代替)。

 

实体entity缓存隔离类型如下

 ----shared   实体实例将被缓存在EntityManagerFactory/ ServerSession级别的。

------isolated    实体和数据不是被缓存在共享缓存上,而是持久化在上下文/工作单元或者客户端session中

-----protected    实体状态信息将被缓存在共享缓存中,但实体实例将不共享。

 

 

使用@Cache的注意事项

如果你在继承的子类中用@Cache定义,这个注释将被忽略。

如果你用@Cache定义@Embeddable,EclipseLink将会抛出异常。

 

EclipseLink缓存是一个内存中的存储库存储读取或写入对象基于类和主键值

EclipseLink使用缓存是为了应对以下情况:

  • 通过控制对象对内存的写入和读取,从而减少对数据库的访问来提高效率
  • 管理锁定和隔离级别
  • 管理对象的身份

 

 

 

官网上有一张图,可以说明缓存的工作流程:

 

对这个图的说明,引用了网络上一篇博客对官网的翻译:

http://www.cnblogs.com/bobsha/p/5702194.html

1. SessionCache,即 Persistence Unit Cache,属于系统级的缓存,所有client共享数据。数据来源主要有两种:

            a)通过EntityManager进行数据读入时,会将读入的数据拷贝一份放到SessionCache;

            b)Unit of Work Cache 进行Commit操作成功后,将数据同步到Session Cache中;

 

2. Unit of WorkCache,即Persistence Context Cache,属于隔离型缓存属于单个client。由EntityManager进行管理,PersistenceContext中保存着读取过的Entity实例。当对Entity执行了Commit操作后会将更改后对数据同步到SessionCache。Flush,Clear操作不会触发同步Session Cache操作。

 

3. 数据查询过程。EntityManager根据实例唯一标识查看Persistence ContextCache中是否存在该实例,如果存在则返回该实例。如果不存在,则查询Persistence UnitCache中是否存在该实例,如果存在则直接返回该实例,如果不存在则访问数据库进行查询,得到数据结果后将此数据保存到Persistence Unit Cache和 Persistence Context Cache中

 

 

 

需要简单了解的:

EntityManager对象的事务管理方式有两 种,分别为JTARESOURCE_LOCAL,即Java Transaction API方法和本地的事务管理

RESOURCE_LOCAL 事务数据库本地的事务。它是数据库级别的事务,只能针对一种数据库,不支持分布式的事务。对于中小型的应用,可以采用

JPA中的事务类 型通过persistence.xml文件中的“transaction-type”元素配置。


自己翻译的,有点力不从心,希望大家有研究的可以指正。

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值